From 1e694f1d029d7d84ddba330e0c952627b75cfee9 Mon Sep 17 00:00:00 2001 From: mertmit Date: Mon, 11 Dec 2023 15:58:33 +0000 Subject: [PATCH] feat: copy & paste user field --- packages/nc-gui/composables/useData.ts | 3 +++ .../useMultiSelect/convertCellData.ts | 18 ++++++++++++++++++ .../nc-gui/composables/useMultiSelect/index.ts | 10 ++++++++++ packages/nocodb/src/db/BaseModelSqlv2.ts | 11 ++++++++++- 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/nc-gui/composables/useData.ts b/packages/nc-gui/composables/useData.ts index 13857ca8aa..5a8e71c6a2 100644 --- a/packages/nc-gui/composables/useData.ts +++ b/packages/nc-gui/composables/useData.ts @@ -241,6 +241,7 @@ export function useData(args: { col.uidt === UITypes.Barcode || col.uidt === UITypes.Rollup || col.uidt === UITypes.Checkbox || + col.uidt === UITypes.User || col.au || col.cdf?.includes(' on update ') ) @@ -387,6 +388,8 @@ export function useData(args: { col.uidt === UITypes.QrCode || col.uidt === UITypes.Barcode || col.uidt === UITypes.Rollup || + col.uidt === UITypes.Checkbox || + col.uidt === UITypes.User || col.au || col.cdf?.includes(' on update ') ) diff --git a/packages/nc-gui/composables/useMultiSelect/convertCellData.ts b/packages/nc-gui/composables/useMultiSelect/convertCellData.ts index 5044ef1798..0abc102547 100644 --- a/packages/nc-gui/composables/useMultiSelect/convertCellData.ts +++ b/packages/nc-gui/composables/useMultiSelect/convertCellData.ts @@ -195,6 +195,24 @@ export default function convertCellData( return validVals.join(',') } + case UITypes.User: { + let parsedVal + try { + try { + parsedVal = typeof value === 'string' ? JSON.parse(value) : value + } catch { + parsedVal = null + } + } catch (e) { + if (isMultiple) { + return null + } else { + throw new Error('Invalid user data') + } + } + + return parsedVal || value + } case UITypes.LinkToAnotherRecord: case UITypes.Lookup: case UITypes.Rollup: diff --git a/packages/nc-gui/composables/useMultiSelect/index.ts b/packages/nc-gui/composables/useMultiSelect/index.ts index b6eeecffc0..a691067067 100644 --- a/packages/nc-gui/composables/useMultiSelect/index.ts +++ b/packages/nc-gui/composables/useMultiSelect/index.ts @@ -112,6 +112,16 @@ export function useMultiSelect( textToCopy = !!textToCopy } + if (columnObj.uidt === UITypes.User) { + if (textToCopy && Array.isArray(textToCopy)) { + textToCopy = textToCopy + .map((user: { id: string; email: string; display_name: string }) => { + return user.email + }) + .join(', ') + } + } + if (typeof textToCopy === 'object') { textToCopy = JSON.stringify(textToCopy) } else { diff --git a/packages/nocodb/src/db/BaseModelSqlv2.ts b/packages/nocodb/src/db/BaseModelSqlv2.ts index 1393babfe4..b80ef90f7c 100644 --- a/packages/nocodb/src/db/BaseModelSqlv2.ts +++ b/packages/nocodb/src/db/BaseModelSqlv2.ts @@ -5483,8 +5483,17 @@ class BaseModelSqlv2 { } else if (column.uidt === UITypes.User) { if (data[column.column_name]) { const userIds = []; + + if (typeof data[column.column_name] === 'string') { + try { + data[column.column_name] = JSON.parse(data[column.column_name]); + } catch (e) {} + } + if (typeof data[column.column_name] === 'string') { - const users = data[column.column_name].split(','); + const users = data[column.column_name] + .split(',') + .map((u) => u.trim()); for (const user of users) { try { if (user.includes('@')) {