From 4afe2ae5af16b077a5472731742aa5d703d2ddc2 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 25 Nov 2022 21:01:20 +0530 Subject: [PATCH 1/9] chore: update nocodb-sdk to local path Signed-off-by: Pranav C --- packages/nc-gui/package-lock.json | 52 ++++++++++++------------------- packages/nc-gui/package.json | 2 +- packages/nocodb/package-lock.json | 30 ++++++++++-------- packages/nocodb/package.json | 4 +-- 4 files changed, 40 insertions(+), 48 deletions(-) diff --git a/packages/nc-gui/package-lock.json b/packages/nc-gui/package-lock.json index 2a0693aab2..44503fb2ad 100644 --- a/packages/nc-gui/package-lock.json +++ b/packages/nc-gui/package-lock.json @@ -26,7 +26,7 @@ "jwt-decode": "^3.1.2", "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", - "nocodb-sdk": "0.99.1", + "nocodb-sdk": "file:../nocodb-sdk", "papaparse": "^5.3.2", "socket.io-client": "^4.5.1", "sortablejs": "^1.15.0", @@ -86,7 +86,6 @@ }, "../nocodb-sdk": { "version": "0.99.1", - "extraneous": true, "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", @@ -8391,6 +8390,7 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "devOptional": true, "funding": [ { "type": "individual", @@ -11748,21 +11748,8 @@ } }, "node_modules/nocodb-sdk": { - "version": "0.99.1", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.99.1.tgz", - "integrity": "sha512-CfaYgqi4m5jFWaRazsshvLN468Trfq/DxXVAzLz9hIZv88urYbXJaAwbXTNR8q+CTpACabkN9NW02HL6Jr1LQQ==", - "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.23.0", @@ -23377,7 +23364,8 @@ "follow-redirects": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "devOptional": true }, "form-data": { "version": "4.0.0", @@ -25847,22 +25835,22 @@ } }, "nocodb-sdk": { - "version": "0.99.1", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.99.1.tgz", - "integrity": "sha512-CfaYgqi4m5jFWaRazsshvLN468Trfq/DxXVAzLz9hIZv88urYbXJaAwbXTNR8q+CTpACabkN9NW02HL6Jr1LQQ==", + "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", + "typescript": "^4.0.2" } }, "node-abi": { diff --git a/packages/nc-gui/package.json b/packages/nc-gui/package.json index cf9bbbd31f..808deea19c 100644 --- a/packages/nc-gui/package.json +++ b/packages/nc-gui/package.json @@ -49,7 +49,7 @@ "jwt-decode": "^3.1.2", "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", - "nocodb-sdk": "0.99.1", + "nocodb-sdk": "file:../nocodb-sdk", "papaparse": "^5.3.2", "socket.io-client": "^4.5.1", "sortablejs": "^1.15.0", diff --git a/packages/nocodb/package-lock.json b/packages/nocodb/package-lock.json index 821a93adfa..821fa74cc9 100644 --- a/packages/nocodb/package-lock.json +++ b/packages/nocodb/package-lock.json @@ -67,7 +67,7 @@ "nc-lib-gui": "0.99.1", "nc-plugin": "0.1.2", "ncp": "^2.0.0", - "nocodb-sdk": "0.99.1", + "nocodb-sdk": "file:../nocodb-sdk", "nodemailer": "^6.4.10", "object-hash": "^3.0.0", "os-locale": "^5.0.0", @@ -153,7 +153,6 @@ }, "../nocodb-sdk": { "version": "0.99.1", - "extraneous": true, "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", @@ -10686,13 +10685,8 @@ "dev": true }, "node_modules/nocodb-sdk": { - "version": "0.99.1", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.99.1.tgz", - "integrity": "sha512-CfaYgqi4m5jFWaRazsshvLN468Trfq/DxXVAzLz9hIZv88urYbXJaAwbXTNR8q+CTpACabkN9NW02HL6Jr1LQQ==", - "dependencies": { - "axios": "^0.21.1", - "jsep": "^1.3.6" - } + "resolved": "../nocodb-sdk", + "link": true }, "node_modules/node-abort-controller": { "version": "3.0.1", @@ -26114,12 +26108,22 @@ "dev": true }, "nocodb-sdk": { - "version": "0.99.1", - "resolved": "https://registry.npmjs.org/nocodb-sdk/-/nocodb-sdk-0.99.1.tgz", - "integrity": "sha512-CfaYgqi4m5jFWaRazsshvLN468Trfq/DxXVAzLz9hIZv88urYbXJaAwbXTNR8q+CTpACabkN9NW02HL6Jr1LQQ==", + "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", + "typescript": "^4.0.2" } }, "node-abort-controller": { diff --git a/packages/nocodb/package.json b/packages/nocodb/package.json index e0f8a855a5..2fa5019693 100644 --- a/packages/nocodb/package.json +++ b/packages/nocodb/package.json @@ -107,7 +107,7 @@ "nc-lib-gui": "0.99.1", "nc-plugin": "0.1.2", "ncp": "^2.0.0", - "nocodb-sdk": "0.99.1", + "nocodb-sdk": "file:../nocodb-sdk", "nodemailer": "^6.4.10", "object-hash": "^3.0.0", "os-locale": "^5.0.0", @@ -182,4 +182,4 @@ "prettier": { "singleQuote": true } -} \ No newline at end of file +} From 9c6235f43840f80e276e0ae66bf92a908a147988 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 25 Nov 2022 21:17:25 +0530 Subject: [PATCH 2/9] chore: update nocodb-sdk package-lock Signed-off-by: Pranav C --- packages/nocodb-sdk/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nocodb-sdk/package-lock.json b/packages/nocodb-sdk/package-lock.json index bed634cebd..7ff2be10b0 100644 --- a/packages/nocodb-sdk/package-lock.json +++ b/packages/nocodb-sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "nocodb-sdk", - "version": "0.99.0", + "version": "0.99.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nocodb-sdk", - "version": "0.99.0", + "version": "0.99.1", "license": "AGPL-3.0-or-later", "dependencies": { "axios": "^0.21.1", From b265f812d6d2f5218e4ea79a49be4e596c1fa442 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Sat, 26 Nov 2022 12:06:04 +0800 Subject: [PATCH 3/9] fix(nocodb): change attachment sample payload to array of objects --- .../nocodb/src/lib/meta/helpers/populateSamplePayload.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/nocodb/src/lib/meta/helpers/populateSamplePayload.ts b/packages/nocodb/src/lib/meta/helpers/populateSamplePayload.ts index 0f0a068a22..6fad3c575b 100644 --- a/packages/nocodb/src/lib/meta/helpers/populateSamplePayload.ts +++ b/packages/nocodb/src/lib/meta/helpers/populateSamplePayload.ts @@ -94,7 +94,14 @@ async function getSampleColumnValue(column: Column): Promise { break; case UITypes.Attachment: { - return '[{"url":"https://nocodb.com/dummy.png","title":"image.png","mimetype":"image/png","size":0}]'; + return [ + { + url: 'https://nocodb.com/dummy.png', + title: 'image.png', + mimetype: 'image/png', + size: 0, + }, + ]; } break; case UITypes.Checkbox: From e67d6b3b3264bedd389724e51ec67cfad94b5da1 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Sat, 26 Nov 2022 13:22:35 +0800 Subject: [PATCH 4/9] fix(nocodb): convertAttachmentType logic --- .../db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts index c3ae42f365..f414593a08 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts @@ -158,9 +158,10 @@ class BaseModelSqlv2 { qb.orderBy(this.model.primaryKey.column_name); } - const data = await qb.first(); + let data = await qb.first(); if (data) { + data = this.convertAttachmentType(data); const proto = await this.getProto(); data.__proto__ = proto; } @@ -365,7 +366,8 @@ class BaseModelSqlv2 { qb.groupBy(args.column_name); if (sorts) await sortV2(sorts, qb, this.dbDriver); applyPaginate(qb, rest); - const data = await qb; + let data = await qb; + data = this.convertAttachmentType(data); return data; } @@ -672,10 +674,10 @@ class BaseModelSqlv2 { ); let children = await this.extractRawQueryAndExec(finalQb); - children = this.convertAttachmentType(children); if (this.isMySQL) { children = children[0]; } + children = this.convertAttachmentType(children); const proto = await ( await Model.getBaseModelSQL({ id: rtnId, @@ -967,8 +969,8 @@ class BaseModelSqlv2 { applyPaginate(qb, rest); const proto = await childModel.getProto(); - const data = await qb; - + let data = await qb; + data = this.convertAttachmentType(data); return data.map((c) => { c.__proto__ = proto; return c; @@ -2758,7 +2760,7 @@ class BaseModelSqlv2 { }); } } - return data; + return data.length === 1 ? data[0] : data; } } From e88344a5bf4b6366136976255e6d137b064d3944 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Sat, 26 Nov 2022 14:09:09 +0800 Subject: [PATCH 5/9] refactor(nocodb): combine convertAttachmentType data --- .../src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts index f414593a08..94dcc83ebf 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts @@ -366,9 +366,7 @@ class BaseModelSqlv2 { qb.groupBy(args.column_name); if (sorts) await sortV2(sorts, qb, this.dbDriver); applyPaginate(qb, rest); - let data = await qb; - data = this.convertAttachmentType(data); - return data; + return this.convertAttachmentType(await qb); } async multipleHmList({ colId, ids }, args: { limit?; offset? } = {}) { From 159f0037bb1b5071835146e9a3195e7b035e2cce Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Sat, 26 Nov 2022 14:22:36 +0800 Subject: [PATCH 6/9] fix(nocodb): revise convertAttachmentType logic --- .../sql-data-mapper/lib/sql/BaseModelSqlv2.ts | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts index 94dcc83ebf..ffd0f5e765 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts @@ -2737,6 +2737,15 @@ class BaseModelSqlv2 { : await this.dbDriver.raw(query); } + private _convertAttachmentType(attachmentColumns, d) { + attachmentColumns.forEach((col) => { + if (d[col.title] && typeof d[col.title] === 'string') { + d[col.title] = JSON.parse(d[col.title]); + } + }); + return d; + } + private convertAttachmentType(data) { // attachment is stored in text and parse in UI // convertAttachmentType is used to convert the response in string to array of object in API response @@ -2745,20 +2754,16 @@ class BaseModelSqlv2 { (c) => c.uidt === UITypes.Attachment ); if (attachmentColumns.length) { - if (!Array.isArray(data)) { - data = [data]; + if (Array.isArray(data)) { + data = data.map((d) => + this._convertAttachmentType(attachmentColumns, d) + ); + } else { + this._convertAttachmentType(attachmentColumns, data); } - data = data.map((d) => { - attachmentColumns.forEach((col) => { - if (d[col.title] && typeof d[col.title] === 'string') { - d[col.title] = JSON.parse(d[col.title]); - } - }); - return d; - }); } } - return data.length === 1 ? data[0] : data; + return data; } } From 4749171498010d0b34445413c0d1ace3ab5a76c7 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sat, 26 Nov 2022 12:06:08 +0530 Subject: [PATCH 7/9] fix: pass array/json array to attachment cell from lookup cell Signed-off-by: Pranav C --- packages/nc-gui/app.vue | 2 +- .../components/smartsheet/header/CellIcon.ts | 1 - .../nc-gui/components/virtual-cell/Lookup.vue | 21 ++++++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/nc-gui/app.vue b/packages/nc-gui/app.vue index ca7bf509fa..b9bcde10f4 100644 --- a/packages/nc-gui/app.vue +++ b/packages/nc-gui/app.vue @@ -36,7 +36,7 @@ if (typeof window !== 'undefined') { diff --git a/packages/nc-gui/components/smartsheet/header/CellIcon.ts b/packages/nc-gui/components/smartsheet/header/CellIcon.ts index 7f29cac1aa..d550bdf77c 100644 --- a/packages/nc-gui/components/smartsheet/header/CellIcon.ts +++ b/packages/nc-gui/components/smartsheet/header/CellIcon.ts @@ -19,7 +19,6 @@ import { isJSON, isPercent, isPhoneNumber, - isPrimary, isRating, isSet, isSingleSelect, diff --git a/packages/nc-gui/components/virtual-cell/Lookup.vue b/packages/nc-gui/components/virtual-cell/Lookup.vue index 9284a52ad4..4ba3a394b3 100644 --- a/packages/nc-gui/components/virtual-cell/Lookup.vue +++ b/packages/nc-gui/components/virtual-cell/Lookup.vue @@ -27,14 +27,6 @@ const meta = inject(MetaInj, ref()) const cellValue = inject(CellValueInj, ref()) -const arrValue = computed(() => { - if (!cellValue.value) return [] - - if (Array.isArray(cellValue.value)) return cellValue.value - - return [cellValue.value] -}) - const relationColumn = computed( () => meta.value?.columns?.find((c) => c.id === (column.value?.colOptions as LookupType)?.fk_relation_column_id) as @@ -66,6 +58,19 @@ const lookupColumn = computed( | undefined, ) +const arrValue = computed(() => { + if (!cellValue.value) return [] + + // if lookup column is Attachment and relation type is Belongs to wrap the value in an array + // since the attachment component expects an array or JSON string array + if (lookupColumn.value?.uidt === UITypes.Attachment && relationColumn.value?.colOptions?.type === RelationTypes.BELONGS_TO) + return [cellValue.value] + + if (Array.isArray(cellValue.value)) return cellValue.value + + return [cellValue.value] +}) + provide(MetaInj, lookupTableMeta) provide(CellUrlDisableOverlayInj, ref(true)) From f14c5d965485d597dc3bcbdb37d14329f0030fba Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sat, 26 Nov 2022 12:17:25 +0530 Subject: [PATCH 8/9] fix: add key to sidebar slot to avoid duplicate wrapper elements Signed-off-by: Pranav C --- packages/nc-gui/layouts/default.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nc-gui/layouts/default.vue b/packages/nc-gui/layouts/default.vue index cc836efafa..669173d8e8 100644 --- a/packages/nc-gui/layouts/default.vue +++ b/packages/nc-gui/layouts/default.vue @@ -20,7 +20,7 @@ export default {