diff --git a/packages/nocodb/src/lib/meta/api/columnApis.ts b/packages/nocodb/src/lib/meta/api/columnApis.ts index 82cd920b63..1ff79397cb 100644 --- a/packages/nocodb/src/lib/meta/api/columnApis.ts +++ b/packages/nocodb/src/lib/meta/api/columnApis.ts @@ -557,6 +557,13 @@ export async function columnAdd(req: Request, res: Response) { colBody.colOptions.options.push({ title: '' }); } } + + // Trim end of enum/set + if (colBody.dt === 'enum' || colBody.dt === 'set') { + for (const opt of colBody.colOptions.options) { + opt.title = opt.title.trimEnd() + } + } if (colBody.uidt === UITypes.SingleSelect) { colBody.dtxp = (colBody.colOptions?.options.length) @@ -720,21 +727,6 @@ export async function columnUpdate(req: Request, res: Response) { ) { colBody = getColumnPropsFromUIDT(colBody, base); - if (colBody.uidt === UITypes.SingleSelect) { - colBody.dtxp = (colBody.colOptions?.options.length) - ? `${colBody.colOptions.options.map(o => `'${o.title.replace(/'/gi, '\'\'')}'`).join(',')}` - : ''; - } else if (colBody.uidt === UITypes.MultiSelect){ - colBody.dtxp = (colBody.colOptions?.options.length) - ? `${colBody.colOptions.options.map((o) => { - if(o.title.includes(',')) { - NcError.badRequest('Illegal char(\',\') for MultiSelect'); - } - return `'${o.title.replace(/'/gi, '\'\'')}'`; - }).join(',')}` - : ''; - } - const baseModel = await Model.getBaseModelSQL({ id: table.id, dbDriver: NcConnectionMgrv2.get(base) @@ -809,6 +801,28 @@ export async function columnUpdate(req: Request, res: Response) { } } + // Trim end of enum/set + if (colBody.dt === 'enum' || colBody.dt === 'set') { + for (const opt of colBody.colOptions.options) { + opt.title = opt.title.trimEnd() + } + } + + if (colBody.uidt === UITypes.SingleSelect) { + colBody.dtxp = (colBody.colOptions?.options.length) + ? `${colBody.colOptions.options.map(o => `'${o.title.replace(/'/gi, '\'\'')}'`).join(',')}` + : ''; + } else if (colBody.uidt === UITypes.MultiSelect){ + colBody.dtxp = (colBody.colOptions?.options.length) + ? `${colBody.colOptions.options.map((o) => { + if(o.title.includes(',')) { + NcError.badRequest('Illegal char(\',\') for MultiSelect'); + } + return `'${o.title.replace(/'/gi, '\'\'')}'`; + }).join(',')}` + : ''; + } + // Handle option delete for (const option of column.colOptions.options.filter(oldOp => colBody.colOptions.options.find(newOp => newOp.id === oldOp.id) ? false : true)) { if (!supportedDrivers.includes(driverType) && column.uidt === UITypes.MultiSelect) { diff --git a/packages/nocodb/src/lib/models/Column.ts b/packages/nocodb/src/lib/models/Column.ts index 4a0f2afc9f..cba7f2322f 100644 --- a/packages/nocodb/src/lib/models/Column.ts +++ b/packages/nocodb/src/lib/models/Column.ts @@ -246,6 +246,10 @@ export default class Column implements ColumnType { } } else { for (const [i, option] of column.colOptions.options.entries() || [].entries()) { + // Trim end of enum/set + if (column.dt === 'enum' || column.dt === 'set') { + option.title = option.title.trimEnd(); + } await SelectOption.insert( { ...option, @@ -274,6 +278,10 @@ export default class Column implements ColumnType { } } else { for (const [i, option] of column.colOptions.options.entries() || [].entries()) { + // Trim end of enum/set + if (column.dt === 'enum' || column.dt === 'set') { + option.title = option.title.trimEnd(); + } await SelectOption.insert( { ...option,