From d7d1fe87d44c7558b6a86ea5915599da83e32dc6 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Sat, 9 Sep 2023 16:41:41 +0530 Subject: [PATCH 1/9] Update README.md Screenshots updated. GIF to be done. --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 82b32c8ad1..5b4c333df0 100644 --- a/README.md +++ b/README.md @@ -192,14 +192,15 @@ npm start Access Dashboard using: [http://localhost:8080/dashboard](http://localhost:8080/dashboard) # Screenshots +![2](https://github.com/nocodb/nocodb/assets/86527202/a127c05e-2121-4af2-a342-128e0e2d0291) +![3](https://github.com/nocodb/nocodb/assets/86527202/674da952-8a06-4848-a0e8-a7b02d5f5c88) +![4](https://github.com/nocodb/nocodb/assets/86527202/cbc5152a-9caf-4f77-a8f7-92a9d06d025b) +![5](https://github.com/nocodb/nocodb/assets/86527202/dc75dfdc-c486-4f5a-a853-2a8f9e6b569a) -![1](https://user-images.githubusercontent.com/35857179/194844858-d353bd15-1edf-406c-889b-ba60f76831f4.png) -![2](https://user-images.githubusercontent.com/35857179/194844872-1a1094b9-761b-4ab6-a0ab-8e11dcae6571.png) -![3](https://user-images.githubusercontent.com/35857179/194844881-23f12c4c-7a5f-403e-928c-ef4c53b2665d.png) -![4](https://user-images.githubusercontent.com/35857179/194844885-faaf042f-bad2-4924-84f0-2c08813271d8.png) ![5](https://user-images.githubusercontent.com/35857179/194844886-a17006e0-979d-493f-83c4-0e72f5a9b716.png) -![6](https://user-images.githubusercontent.com/35857179/194844890-b9f265ae-6e40-4fa5-9267-d1367c27c8e6.png) -![7](https://user-images.githubusercontent.com/35857179/194844891-bee9aea3-aff3-4247-a918-b2f3fbbc672e.png) +![7](https://github.com/nocodb/nocodb/assets/86527202/be64e619-7295-43e2-aa95-cace4462b17f) +![8](https://github.com/nocodb/nocodb/assets/86527202/4538bf5a-371f-4ec1-a867-8197e5824286) + ![8](https://user-images.githubusercontent.com/35857179/194844893-82d5e21b-ae61-41bd-9990-31ad659bf490.png) ![9](https://user-images.githubusercontent.com/35857179/194844897-cfd79946-e413-4c97-b16d-eb4d7678bb79.png) ![10](https://user-images.githubusercontent.com/35857179/194844902-c0122570-0dd5-41cf-a26f-6f8d71fefc99.png) From a76277c86e5f0575b051ab69f55e418fb859f059 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sun, 10 Sep 2023 10:03:47 +0530 Subject: [PATCH 2/9] fix: project invite logic correction Signed-off-by: Pranav C --- .../nc-gui/components/project/InviteProjectCollabSection.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui/components/project/InviteProjectCollabSection.vue b/packages/nc-gui/components/project/InviteProjectCollabSection.vue index 7b33eb7242..0f658f7767 100644 --- a/packages/nc-gui/components/project/InviteProjectCollabSection.vue +++ b/packages/nc-gui/components/project/InviteProjectCollabSection.vue @@ -26,10 +26,10 @@ const usersData = ref<{ const isInvitingCollaborators = ref(false) const inviteCollaborator = async () => { - isInvitingCollaborators.value = true - if (isInvitingCollaborators.value) return + isInvitingCollaborators.value = true + try { usersData.value = await inviteUser(inviteData) usersData.roles = inviteData.roles From b47d2df30dcdc16286ab090f5d03251b8b36a633 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sun, 10 Sep 2023 17:47:42 +0530 Subject: [PATCH 3/9] fix: exclude any unnecessary props from app version JSON store value Signed-off-by: Pranav C --- packages/nocodb/src/version-upgrader/NcUpgrader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nocodb/src/version-upgrader/NcUpgrader.ts b/packages/nocodb/src/version-upgrader/NcUpgrader.ts index 78c2364c11..642913f28c 100644 --- a/packages/nocodb/src/version-upgrader/NcUpgrader.ts +++ b/packages/nocodb/src/version-upgrader/NcUpgrader.ts @@ -68,7 +68,7 @@ export default class NcUpgrader { '', 'nc_store', { - value: JSON.stringify(config), + value: JSON.stringify({ version: config.version }), }, { key: NcUpgrader.STORE_KEY, From b60b88fd0ad838c4d5d84117b836f11921f88fa8 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sun, 10 Sep 2023 22:28:38 +0530 Subject: [PATCH 4/9] fix: missing Links column in swagger child api param list Signed-off-by: Pranav C --- .../nocodb/src/services/api-docs/swagger/templates/params.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nocodb/src/services/api-docs/swagger/templates/params.ts b/packages/nocodb/src/services/api-docs/swagger/templates/params.ts index 16e8d69501..b1930cf089 100644 --- a/packages/nocodb/src/services/api-docs/swagger/templates/params.ts +++ b/packages/nocodb/src/services/api-docs/swagger/templates/params.ts @@ -1,4 +1,4 @@ -import { RelationTypes, UITypes } from 'nocodb-sdk'; +import { isLinksOrLTAR, RelationTypes, UITypes } from 'nocodb-sdk' import type { LinkToAnotherRecordColumn } from '~/models'; import type { SwaggerColumn } from '../getSwaggerColumnMetas'; @@ -100,7 +100,7 @@ export const columnNameQueryParam = { export const columnNameParam = (columns: SwaggerColumn[]) => { const columnNames = []; for (const { column } of columns) { - if (column.uidt !== UITypes.LinkToAnotherRecord || column.system) continue; + if (isLinksOrLTAR(column) || column.system) continue; columnNames.push(column.title); } From 791a3bebeb391f8035442e69da0be70e77938c87 Mon Sep 17 00:00:00 2001 From: mertmit Date: Mon, 11 Sep 2023 03:49:18 +0300 Subject: [PATCH 5/9] fix: validate invite role Signed-off-by: mertmit --- .../project-users/project-users.service.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/nocodb/src/services/project-users/project-users.service.ts b/packages/nocodb/src/services/project-users/project-users.service.ts index 43e5ee06c4..bad2b32a47 100644 --- a/packages/nocodb/src/services/project-users/project-users.service.ts +++ b/packages/nocodb/src/services/project-users/project-users.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { AppEvents, + extractRolesObj, OrgUserRoles, PluginCategory, ProjectRoles, @@ -53,6 +54,26 @@ export class ProjectUsersService { param.projectUser, ); + if ( + getProjectRolePower({ + project_roles: extractRolesObj(param.projectUser.roles), + }) > getProjectRolePower(param.req.user) + ) { + NcError.badRequest(`Insufficient privilege to invite with this role`); + } + + if ( + ![ + ProjectRoles.CREATOR, + ProjectRoles.EDITOR, + ProjectRoles.COMMENTER, + ProjectRoles.VIEWER, + ProjectRoles.NO_ACCESS, + ].includes(param.projectUser.roles as ProjectRoles) + ) { + NcError.badRequest('Invalid role'); + } + const emails = (param.projectUser.email || '') .toLowerCase() .split(/\s*,\s*/) From eb1b5d2c5f78c899a4085419ecd7e957adf13845 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Mon, 11 Sep 2023 11:01:03 +0530 Subject: [PATCH 6/9] fix: condition correction Signed-off-by: Pranav C --- .../nocodb/src/services/api-docs/swagger/templates/params.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nocodb/src/services/api-docs/swagger/templates/params.ts b/packages/nocodb/src/services/api-docs/swagger/templates/params.ts index b1930cf089..b0d980b1f7 100644 --- a/packages/nocodb/src/services/api-docs/swagger/templates/params.ts +++ b/packages/nocodb/src/services/api-docs/swagger/templates/params.ts @@ -100,7 +100,7 @@ export const columnNameQueryParam = { export const columnNameParam = (columns: SwaggerColumn[]) => { const columnNames = []; for (const { column } of columns) { - if (isLinksOrLTAR(column) || column.system) continue; + if (!isLinksOrLTAR(column) || column.system) continue; columnNames.push(column.title); } From 5735e6560bf68d4a4f539d2ed79f4ae47d6f11bf Mon Sep 17 00:00:00 2001 From: pranavxc Date: Mon, 11 Sep 2023 05:49:07 +0000 Subject: [PATCH 7/9] [create-pull-request] automated change Signed-off-by: GitHub --- packages/nc-gui/package-lock.json | 56 ++++++++++++++++++------------- packages/nc-gui/package.json | 2 +- packages/nc-lib-gui/package.json | 2 +- packages/nocodb-sdk/package.json | 2 +- packages/nocodb/package-lock.json | 52 +++++++++++++--------------- packages/nocodb/package.json | 8 ++--- 6 files changed, 63 insertions(+), 59 deletions(-) diff --git a/packages/nc-gui/package-lock.json b/packages/nc-gui/package-lock.json index 5ecb38c4e4..fa068956cc 100644 --- a/packages/nc-gui/package-lock.json +++ b/packages/nc-gui/package-lock.json @@ -37,7 +37,7 @@ "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", "monaco-sql-languages": "^0.11.0", - "nocodb-sdk": "file:../nocodb-sdk", + "nocodb-sdk": "0.111.4", "papaparse": "^5.3.2", "parse-github-url": "^1.0.2", "pinia": "^2.1.4", @@ -130,7 +130,8 @@ } }, "../nocodb-sdk": { - "version": "0.111.3", + "version": "0.111.4", + "extraneous": true, "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", @@ -8943,7 +8944,6 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "devOptional": true, "funding": [ { "type": "individual", @@ -11680,8 +11680,21 @@ } }, "node_modules/nocodb-sdk": { - "resolved": "../nocodb-sdk", - "link": true + "version": "0.111.4", + "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", + "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", + "dependencies": { + "axios": "^0.21.1", + "jsep": "^1.3.6" + } + }, + "node_modules/nocodb-sdk/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } }, "node_modules/node-abi": { "version": "3.45.0", @@ -23598,8 +23611,7 @@ "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "devOptional": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "for-each": { "version": "0.3.3", @@ -25619,24 +25631,22 @@ } }, "nocodb-sdk": { - "version": "file:../nocodb-sdk", + "version": "0.111.4", + "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", + "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", "requires": { - "@typescript-eslint/eslint-plugin": "^4.0.1", - "@typescript-eslint/parser": "^4.0.1", "axios": "^0.21.1", - "cspell": "^4.1.0", - "eslint": "^7.8.0", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-functional": "^3.0.2", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-prettier": "^4.0.0", - "jsep": "^1.3.6", - "npm-run-all": "^4.1.5", - "prettier": "^2.1.1", - "rimraf": "^5.0.1", - "tsc-alias": "^1.8.7", - "typescript": "^4.7.4" + "jsep": "^1.3.6" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + } } }, "node-abi": { diff --git a/packages/nc-gui/package.json b/packages/nc-gui/package.json index 8ca6674267..d23d49f167 100644 --- a/packages/nc-gui/package.json +++ b/packages/nc-gui/package.json @@ -60,7 +60,7 @@ "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", "monaco-sql-languages": "^0.11.0", - "nocodb-sdk": "file:../nocodb-sdk", + "nocodb-sdk": "0.111.4", "papaparse": "^5.3.2", "parse-github-url": "^1.0.2", "pinia": "^2.1.4", diff --git a/packages/nc-lib-gui/package.json b/packages/nc-lib-gui/package.json index 9d243938b5..6fbe220b2f 100644 --- a/packages/nc-lib-gui/package.json +++ b/packages/nc-lib-gui/package.json @@ -1,6 +1,6 @@ { "name": "nc-lib-gui", - "version": "0.111.3", + "version": "0.111.4", "description": "NocoDB GUI", "author": { "name": "NocoDB", diff --git a/packages/nocodb-sdk/package.json b/packages/nocodb-sdk/package.json index 16698a7398..e35573dc3b 100644 --- a/packages/nocodb-sdk/package.json +++ b/packages/nocodb-sdk/package.json @@ -1,6 +1,6 @@ { "name": "nocodb-sdk", - "version": "0.111.3", + "version": "0.111.4", "description": "NocoDB SDK", "main": "build/main/index.js", "typings": "build/main/index.d.ts", diff --git a/packages/nocodb/package-lock.json b/packages/nocodb/package-lock.json index 5ee2f55072..22e5beceda 100644 --- a/packages/nocodb/package-lock.json +++ b/packages/nocodb/package-lock.json @@ -1,12 +1,12 @@ { "name": "nocodb", - "version": "0.111.3", + "version": "0.111.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nocodb", - "version": "0.111.3", + "version": "0.111.4", "license": "AGPL-3.0-or-later", "dependencies": { "@aws-sdk/client-kafka": "^3.332.0", @@ -93,12 +93,12 @@ "mysql2": "^3.2.0", "nanoid": "^3.1.20", "nc-help": "0.2.92", - "nc-lib-gui": "0.111.3", + "nc-lib-gui": "0.111.4", "nc-plugin": "^0.1.3", "ncp": "^2.0.0", "nestjs-kafka": "^1.0.6", "nestjs-throttler-storage-redis": "^0.3.0", - "nocodb-sdk": "file:../nocodb-sdk", + "nocodb-sdk": "0.111.4", "nodemailer": "^6.4.10", "object-hash": "^3.0.0", "object-sizeof": "^2.6.1", @@ -210,7 +210,8 @@ } }, "../nocodb-sdk": { - "version": "0.111.3", + "version": "0.111.4", + "extraneous": true, "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", @@ -14257,9 +14258,9 @@ } }, "node_modules/nc-lib-gui": { - "version": "0.111.3", - "resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.111.3.tgz", - "integrity": "sha512-tbjyRkc7/xcCzEI8mHhQpJ8iEE/gBlJNWJzmHP5dSTnz36DRBGRPw1VGl1nAnZb/BVkYjHP2lyjR0CQLiv+79Q==", + "version": "0.111.4", + "resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.111.4.tgz", + "integrity": "sha512-2ST6vycxHpQ0mropVq9GRhVt9dWng3+hZZPyjZ6HiK8kXRjBrsv7Ck4WLIRj7TuloRTI8zn9Mixud9CkvgkvWQ==", "dependencies": { "express": "^4.17.1" } @@ -14382,8 +14383,13 @@ } }, "node_modules/nocodb-sdk": { - "resolved": "../nocodb-sdk", - "link": true + "version": "0.111.4", + "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", + "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", + "dependencies": { + "axios": "^0.21.1", + "jsep": "^1.3.6" + } }, "node_modules/node-abort-controller": { "version": "3.1.1", @@ -30822,9 +30828,9 @@ } }, "nc-lib-gui": { - "version": "0.111.3", - "resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.111.3.tgz", - "integrity": "sha512-tbjyRkc7/xcCzEI8mHhQpJ8iEE/gBlJNWJzmHP5dSTnz36DRBGRPw1VGl1nAnZb/BVkYjHP2lyjR0CQLiv+79Q==", + "version": "0.111.4", + "resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.111.4.tgz", + "integrity": "sha512-2ST6vycxHpQ0mropVq9GRhVt9dWng3+hZZPyjZ6HiK8kXRjBrsv7Ck4WLIRj7TuloRTI8zn9Mixud9CkvgkvWQ==", "requires": { "express": "^4.17.1" } @@ -30902,24 +30908,12 @@ "requires": {} }, "nocodb-sdk": { - "version": "file:../nocodb-sdk", + "version": "0.111.4", + "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", + "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", "requires": { - "@typescript-eslint/eslint-plugin": "^4.0.1", - "@typescript-eslint/parser": "^4.0.1", "axios": "^0.21.1", - "cspell": "^4.1.0", - "eslint": "^7.8.0", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-functional": "^3.0.2", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-prettier": "^4.0.0", - "jsep": "^1.3.6", - "npm-run-all": "^4.1.5", - "prettier": "^2.1.1", - "rimraf": "^5.0.1", - "tsc-alias": "^1.8.7", - "typescript": "^4.7.4" + "jsep": "^1.3.6" } }, "node-abort-controller": { diff --git a/packages/nocodb/package.json b/packages/nocodb/package.json index 24fdfc741f..6293e1bbc0 100644 --- a/packages/nocodb/package.json +++ b/packages/nocodb/package.json @@ -1,6 +1,6 @@ { "name": "nocodb", - "version": "0.111.3", + "version": "0.111.4", "description": "NocoDB Backend", "main": "dist/bundle.js", "author": { @@ -126,12 +126,12 @@ "mysql2": "^3.2.0", "nanoid": "^3.1.20", "nc-help": "0.2.92", - "nc-lib-gui": "0.111.3", + "nc-lib-gui": "0.111.4", "nc-plugin": "^0.1.3", "ncp": "^2.0.0", "nestjs-kafka": "^1.0.6", "nestjs-throttler-storage-redis": "^0.3.0", - "nocodb-sdk": "file:../nocodb-sdk", + "nocodb-sdk": "0.111.4", "nodemailer": "^6.4.10", "object-hash": "^3.0.0", "object-sizeof": "^2.6.1", @@ -223,4 +223,4 @@ "coverageDirectory": "../coverage", "testEnvironment": "node" } -} +} \ No newline at end of file From 7f8e52d44c8080fba2922ce706aac62a6c993c1a Mon Sep 17 00:00:00 2001 From: Pranav C Date: Mon, 11 Sep 2023 12:03:06 +0530 Subject: [PATCH 8/9] chore: refer sdk dependency locally Signed-off-by: Pranav C --- packages/nc-gui/package-lock.json | 54 +++++++++++---------------- packages/nc-gui/package.json | 2 +- packages/nocodb-sdk/package-lock.json | 4 +- packages/nocodb/package-lock.json | 32 +++++++++------- packages/nocodb/package.json | 4 +- 5 files changed, 46 insertions(+), 50 deletions(-) diff --git a/packages/nc-gui/package-lock.json b/packages/nc-gui/package-lock.json index fa068956cc..0887d56ef6 100644 --- a/packages/nc-gui/package-lock.json +++ b/packages/nc-gui/package-lock.json @@ -37,7 +37,7 @@ "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", "monaco-sql-languages": "^0.11.0", - "nocodb-sdk": "0.111.4", + "nocodb-sdk": "file:../nocodb-sdk", "papaparse": "^5.3.2", "parse-github-url": "^1.0.2", "pinia": "^2.1.4", @@ -131,7 +131,6 @@ }, "../nocodb-sdk": { "version": "0.111.4", - "extraneous": true, "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", @@ -8944,6 +8943,7 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "devOptional": true, "funding": [ { "type": "individual", @@ -11680,21 +11680,8 @@ } }, "node_modules/nocodb-sdk": { - "version": "0.111.4", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", - "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", - "dependencies": { - "axios": "^0.21.1", - "jsep": "^1.3.6" - } - }, - "node_modules/nocodb-sdk/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } + "resolved": "../nocodb-sdk", + "link": true }, "node_modules/node-abi": { "version": "3.45.0", @@ -23611,7 +23598,8 @@ "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "devOptional": true }, "for-each": { "version": "0.3.3", @@ -25631,22 +25619,24 @@ } }, "nocodb-sdk": { - "version": "0.111.4", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", - "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", + "version": "file:../nocodb-sdk", "requires": { + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", "axios": "^0.21.1", - "jsep": "^1.3.6" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - } + "cspell": "^4.1.0", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-functional": "^3.0.2", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-prettier": "^4.0.0", + "jsep": "^1.3.6", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.1", + "rimraf": "^5.0.1", + "tsc-alias": "^1.8.7", + "typescript": "^4.7.4" } }, "node-abi": { diff --git a/packages/nc-gui/package.json b/packages/nc-gui/package.json index d23d49f167..8ca6674267 100644 --- a/packages/nc-gui/package.json +++ b/packages/nc-gui/package.json @@ -60,7 +60,7 @@ "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", "monaco-sql-languages": "^0.11.0", - "nocodb-sdk": "0.111.4", + "nocodb-sdk": "file:../nocodb-sdk", "papaparse": "^5.3.2", "parse-github-url": "^1.0.2", "pinia": "^2.1.4", diff --git a/packages/nocodb-sdk/package-lock.json b/packages/nocodb-sdk/package-lock.json index e940e0383d..ebe7972241 100644 --- a/packages/nocodb-sdk/package-lock.json +++ b/packages/nocodb-sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "nocodb-sdk", - "version": "0.111.3", + "version": "0.111.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nocodb-sdk", - "version": "0.111.3", + "version": "0.111.4", "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", diff --git a/packages/nocodb/package-lock.json b/packages/nocodb/package-lock.json index 22e5beceda..79045b1ab2 100644 --- a/packages/nocodb/package-lock.json +++ b/packages/nocodb/package-lock.json @@ -98,7 +98,7 @@ "ncp": "^2.0.0", "nestjs-kafka": "^1.0.6", "nestjs-throttler-storage-redis": "^0.3.0", - "nocodb-sdk": "0.111.4", + "nocodb-sdk": "file:../nocodb-sdk", "nodemailer": "^6.4.10", "object-hash": "^3.0.0", "object-sizeof": "^2.6.1", @@ -211,7 +211,6 @@ }, "../nocodb-sdk": { "version": "0.111.4", - "extraneous": true, "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", @@ -14383,13 +14382,8 @@ } }, "node_modules/nocodb-sdk": { - "version": "0.111.4", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", - "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", - "dependencies": { - "axios": "^0.21.1", - "jsep": "^1.3.6" - } + "resolved": "../nocodb-sdk", + "link": true }, "node_modules/node-abort-controller": { "version": "3.1.1", @@ -30908,12 +30902,24 @@ "requires": {} }, "nocodb-sdk": { - "version": "0.111.4", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.111.4.tgz", - "integrity": "sha512-LFjaUWgghTvvWERvEzSLYKnre8gR9AVKXEBkImWeSh6C9VUvlDEOaqOzhmLvozfKQwgsijhCGg7dJcmvvKH0PA==", + "version": "file:../nocodb-sdk", "requires": { + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", "axios": "^0.21.1", - "jsep": "^1.3.6" + "cspell": "^4.1.0", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-functional": "^3.0.2", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-prettier": "^4.0.0", + "jsep": "^1.3.6", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.1", + "rimraf": "^5.0.1", + "tsc-alias": "^1.8.7", + "typescript": "^4.7.4" } }, "node-abort-controller": { diff --git a/packages/nocodb/package.json b/packages/nocodb/package.json index 6293e1bbc0..34edbcb6ca 100644 --- a/packages/nocodb/package.json +++ b/packages/nocodb/package.json @@ -131,7 +131,7 @@ "ncp": "^2.0.0", "nestjs-kafka": "^1.0.6", "nestjs-throttler-storage-redis": "^0.3.0", - "nocodb-sdk": "0.111.4", + "nocodb-sdk": "file:../nocodb-sdk", "nodemailer": "^6.4.10", "object-hash": "^3.0.0", "object-sizeof": "^2.6.1", @@ -223,4 +223,4 @@ "coverageDirectory": "../coverage", "testEnvironment": "node" } -} \ No newline at end of file +} From 657bbf8ecaf7f489d093802bc1f04bcfb645ab57 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Mon, 11 Sep 2023 21:17:06 +0530 Subject: [PATCH 9/9] test: enable org role test Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- packages/nocodb/src/run/testDocker.ts | 2 +- tests/playwright/pages/Account/Users.ts | 23 +++--- .../accountUserManagement.spec.ts | 71 ++++++++++++++----- .../db/usersAccounts/rolesCreate.spec.ts | 12 ++-- 4 files changed, 70 insertions(+), 38 deletions(-) diff --git a/packages/nocodb/src/run/testDocker.ts b/packages/nocodb/src/run/testDocker.ts index aaaebf517f..d8984b002a 100644 --- a/packages/nocodb/src/run/testDocker.ts +++ b/packages/nocodb/src/run/testDocker.ts @@ -36,7 +36,7 @@ process.env[`DEBUG`] = 'xc*'; console.log(admin_response.data); } - for (let i = 0; i < 8; i++) { + for (let i = 0; i < 4; i++) { if (!(await User.getByEmail(`user-${i}@nocodb.com`))) { const response = await axios.post( `http://localhost:${ diff --git a/tests/playwright/pages/Account/Users.ts b/tests/playwright/pages/Account/Users.ts index f18224f8a8..a95ab580f9 100644 --- a/tests/playwright/pages/Account/Users.ts +++ b/tests/playwright/pages/Account/Users.ts @@ -25,9 +25,7 @@ export class AccountUsersPage extends BasePage { return this.accountPage.get().locator(`[data-testid="nc-super-user-list"]`); } - async invite({ email: _email, role }: { email: string; role: string }) { - const email = this.prefixEmail(_email); - + async invite({ email, role }: { email: string; role: string }) { await this.inviteUserBtn.click(); await this.inviteUserModal.locator(`input[placeholder="E-mail"]`).fill(email); await this.inviteUserModal.locator(`.nc-user-roles`).click(); @@ -50,21 +48,18 @@ export class AccountUsersPage extends BasePage { await this.inviteUserModal.locator(`button.ant-btn-icon-only:visible`).first().click(); } - getUserRow({ email: _email }: { email: string }) { - const email = this.prefixEmail(_email); + async getUserRow({ email }: { email: string }) { + // ensure page is loaded + await this.get().waitFor(); return this.get().locator(`tr:has-text("${email}")`); } async updateRole({ email, role }: { email: string; role: string }) { - const userRow = this.getUserRow({ email }); - + const userRow = await this.getUserRow({ email }); await userRow.locator(`.nc-user-roles`).click(); - - // todo: replace delay with waitForSelector - await new Promise(resolve => setTimeout(resolve, 400)); - - await this.rootPage.locator(`.nc-users-list-role-option:visible:has-text("${role}")`).click(); - await this.verifyToast({ message: 'Successfully updated the user details' }); + await this.rootPage.locator(`.nc-users-list-role-option:visible:has-text("${role}")`).waitFor(); + await this.rootPage.locator(`.nc-users-list-role-option:visible:has-text("${role}")`).last().click(); + await this.rootPage.locator(`.nc-users-list-role-option`).last().waitFor({ state: 'hidden' }); } async inviteMore() { @@ -72,7 +67,7 @@ export class AccountUsersPage extends BasePage { } async openRowActionMenu({ email }: { email: string }) { - const userRow = this.getUserRow({ email }); + const userRow = await this.getUserRow({ email }); return userRow.locator(`.nc-user-row-action`).click(); } diff --git a/tests/playwright/tests/db/usersAccounts/accountUserManagement.spec.ts b/tests/playwright/tests/db/usersAccounts/accountUserManagement.spec.ts index 890b91142b..ff64850176 100644 --- a/tests/playwright/tests/db/usersAccounts/accountUserManagement.spec.ts +++ b/tests/playwright/tests/db/usersAccounts/accountUserManagement.spec.ts @@ -1,31 +1,55 @@ -import { test } from '@playwright/test'; +import { expect, test } from '@playwright/test'; import { AccountPage } from '../../../pages/Account'; import { AccountUsersPage } from '../../../pages/Account/Users'; import { SignupPage } from '../../../pages/SignupPage'; import setup, { unsetup } from '../../../setup'; -import { WorkspacePage } from '../../../pages/WorkspacePage'; import { getDefaultPwd } from '../../../tests/utils/general'; +import { Api } from 'nocodb-sdk'; +import { DashboardPage } from '../../../pages/Dashboard'; +import { LoginPage } from '../../../pages/LoginPage'; +let api: Api; const roleDb = [ - { email: 'creator@nocodb.com', role: 'Organization Level Creator', url: '' }, - { email: 'viewer@nocodb.com', role: 'Organization Level Viewer', url: '' }, + { email: 'org_creator@nocodb.com', role: 'Organization Level Creator', url: '' }, + { email: 'org_viewer@nocodb.com', role: 'Organization Level Viewer', url: '' }, ]; -test.describe.skip('User roles', () => { +test.describe('User roles', () => { let accountUsersPage: AccountUsersPage; let accountPage: AccountPage; let signupPage: SignupPage; - let workspacePage: WorkspacePage; + let loginPage: LoginPage; + let dashboard: DashboardPage; // @ts-ignore let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page, isEmptyProject: true }); + context = await setup({ page, isEmptyProject: true, isSuperUser: true }); + dashboard = new DashboardPage(page, context.project); accountPage = new AccountPage(page); accountUsersPage = new AccountUsersPage(accountPage); - signupPage = new SignupPage(accountPage.rootPage); - workspacePage = new WorkspacePage(accountPage.rootPage); + loginPage = new LoginPage(accountPage.rootPage); + + try { + api = new Api({ + baseURL: `http://localhost:8080/`, + headers: { + 'xc-auth': context.token, + }, + }); + } catch (e) { + console.log(e); + } + + // check if user already exists; if so- remove them + for (let i = 0; i < roleDb.length; i++) { + const user = await api.orgUsers.list(); + if (user.list.length > 0) { + const u = user.list.find((u: any) => u.email === roleDb[i].email); + if (u) await api.orgUsers.delete(u.id); + } + } }); test.afterEach(async () => { @@ -44,12 +68,21 @@ test.describe.skip('User roles', () => { role: roleDb[i].role, }); await accountUsersPage.closeInvite(); - await signupAndVerify(i); - await accountPage.rootPage.reload({ waitUntil: 'networkidle' }); - await accountUsersPage.goto(); } - // update role + await signupAndVerify(0); + await accountUsersPage.goto(); + await signupAndVerify(1); + + await dashboard.signOut(); + await loginPage.signIn({ + email: 'user@nocodb.com', + password: getDefaultPwd(), + withoutPrefix: true, + }); + + await accountUsersPage.goto(); + // change role for (let i = 0; i < roleDb.length; i++) { await accountUsersPage.updateRole({ email: roleDb[i].email, @@ -74,10 +107,16 @@ test.describe.skip('User roles', () => { await signupPage.signUp({ email: roleDb[roleIdx].email, password: getDefaultPwd(), + withoutPrefix: true, }); - await workspacePage.checkWorkspaceCreateButton({ - exists: roleDb[roleIdx].role === 'Organization Level Creator', - }); + // wait for page rendering to complete after sign up + await dashboard.rootPage.waitForTimeout(1000); + + if (roleDb[roleIdx].role === 'Organization Level Creator') { + expect(await dashboard.leftSidebar.btn_newProject.isVisible()).toBeTruthy(); + } else { + expect(await dashboard.leftSidebar.btn_newProject.isVisible()).toBeFalsy(); + } } }); diff --git a/tests/playwright/tests/db/usersAccounts/rolesCreate.spec.ts b/tests/playwright/tests/db/usersAccounts/rolesCreate.spec.ts index 42305c7229..5ead07dd41 100644 --- a/tests/playwright/tests/db/usersAccounts/rolesCreate.spec.ts +++ b/tests/playwright/tests/db/usersAccounts/rolesCreate.spec.ts @@ -1,11 +1,10 @@ import { test } from '@playwright/test'; import { DashboardPage } from '../../../pages/Dashboard'; import setup, { unsetup } from '../../../setup'; -import { SettingsPage } from '../../../pages/Dashboard/Settings'; import { SignupPage } from '../../../pages/SignupPage'; import { ProjectsPage } from '../../../pages/ProjectsPage'; import { getDefaultPwd } from '../../../tests/utils/general'; -import { WorkspacePage } from '../../../pages/WorkspacePage'; +import { isEE } from '../../../setup/db'; const roleDb = [ { email: 'creator@nocodb.com', role: 'creator', url: '' }, @@ -15,27 +14,26 @@ const roleDb = [ ]; test.describe.skip('User roles', () => { + if (isEE()) { + test.skip(); + } let dashboard: DashboardPage; - let settings: SettingsPage; let signupPage: SignupPage; let projectsPage: ProjectsPage; - let workspacePage: WorkspacePage; let context: any; test.beforeEach(async ({ page }) => { context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); - settings = dashboard.settings; signupPage = new SignupPage(page); projectsPage = new ProjectsPage(page); - workspacePage = new WorkspacePage(page); }); test.afterEach(async () => { await unsetup(context); }); - test.skip('Create role', async () => { + test('Create role', async () => { test.slow(); for (let i = 0; i < roleDb.length; i++) {