import { type IDataObject, type INodeExecutionData, type INodeProperties, type IExecuteFunctions, updateDisplayOptions, } from 'n8n-workflow'; import { seaTableApiRequest, getTableColumns, split, rowExport, updateAble, splitStringColumnsToArrays, } from '../../GenericFunctions'; import type { TColumnsUiValues, TColumnValue } from '../../types'; import type { IRowObject } from '../Interfaces'; export const properties: INodeProperties[] = [ { displayName: 'Data to Send', name: 'fieldsToSend', type: 'options', options: [ { name: 'Auto-Map Input Data to Columns', value: 'autoMapInputData', description: 'Use when node input properties match destination column names', }, { name: 'Define Below for Each Column', value: 'defineBelow', description: 'Set the value for each destination column', }, ], default: 'defineBelow', description: 'Whether to insert the input data this node receives in the new row', }, { displayName: 'Inputs to Ignore', name: 'inputsToIgnore', type: 'string', displayOptions: { show: { resource: ['row'], operation: ['update'], fieldsToSend: ['autoMapInputData'], }, }, default: '', description: 'List of input properties to avoid sending, separated by commas. Leave empty to send all properties.', placeholder: 'Enter properties...', }, { displayName: 'Columns to Send', name: 'columnsUi', placeholder: 'Add Column', type: 'fixedCollection', typeOptions: { multipleValueButtonText: 'Add Column to Send', multipleValues: true, }, options: [ { displayName: 'Column', name: 'columnValues', values: [ { displayName: 'Column Name or ID', name: 'columnName', type: 'options', description: 'Choose from the list, or specify an ID using an expression', typeOptions: { loadOptionsDependsOn: ['tableName'], loadOptionsMethod: 'getTableUpdateAbleColumns', }, default: '', }, { displayName: 'Column Value', name: 'columnValue', type: 'string', default: '', }, ], }, ], displayOptions: { show: { resource: ['row'], operation: ['update'], fieldsToSend: ['defineBelow'], }, }, default: {}, description: 'Add destination column with its value. Provide the value in this way:Date: YYYY-MM-DD or YYYY-MM-DD hh:mmDuration: time in secondsCheckbox: true, on or 1Multi-Select: comma-separated list.', }, { displayName: 'Hint: Link, files, images or digital signatures have to be added separately.', name: 'notice', type: 'notice', default: '', }, ]; const displayOptions = { show: { resource: ['row'], operation: ['update'], }, }; export const description = updateDisplayOptions(displayOptions, properties); export async function execute( this: IExecuteFunctions, index: number, ): Promise { const tableName = this.getNodeParameter('tableName', index) as string; const tableColumns = await getTableColumns.call(this, tableName); const fieldsToSend = this.getNodeParameter('fieldsToSend', index) as | 'defineBelow' | 'autoMapInputData'; const rowId = this.getNodeParameter('rowId', index) as string; let rowInput = {} as IRowObject; // get rowInput, an object of key:value pairs like { Name: 'Promo Action 1', Status: "Draft" }. if (fieldsToSend === 'autoMapInputData') { const items = this.getInputData(); const incomingKeys = Object.keys(items[index].json); const inputDataToIgnore = split(this.getNodeParameter('inputsToIgnore', index, '') as string); for (const key of incomingKeys) { if (inputDataToIgnore.includes(key)) continue; rowInput[key] = items[index].json[key] as TColumnValue; } } else { const columns = this.getNodeParameter('columnsUi.columnValues', index, []) as TColumnsUiValues; for (const column of columns) { rowInput[column.columnName] = column.columnValue; } } // only keep key:value pairs for columns that are allowed to update. rowInput = rowExport(rowInput, updateAble(tableColumns)); // string to array: multi-select and collaborators rowInput = splitStringColumnsToArrays(rowInput, tableColumns); const body = { table_name: tableName, updates: [ { row_id: rowId, row: rowInput, }, ], } as IDataObject; const responseData = await seaTableApiRequest.call( this, {}, 'PUT', '/api-gateway/api/v2/dtables/{{dtable_uuid}}/rows/', body, ); return this.helpers.returnJsonArray(responseData as IDataObject[]); }