mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.0 KiB
72 lines
2.0 KiB
import { UITypes } from 'nocodb-sdk' |
|
import { getCheckboxValue } from './parsers/parserHelpers' |
|
|
|
/* |
|
* @param {string} str - string with numbers |
|
* @returns {number} - number extracted from string |
|
* |
|
* @example abc123 -> 123 |
|
* @example 12.3abc -> 12.3 |
|
* @example 12.3.2 -> 12.32 |
|
*/ |
|
function extractNumbers(str: string): number { |
|
const parts = str.replace(/[^\d.]/g, '').split('.') |
|
if (parts.length > 1) parts[0] += '.' |
|
|
|
return parseFloat(parts.join('')) |
|
} |
|
|
|
/* |
|
* @param {string} value - string value of duration |
|
* @returns {number} - duration in seconds |
|
* |
|
* @example 1:30:00 -> 5400 |
|
* @example 1:30 -> 5400 |
|
* @example 90 -> 90 |
|
*/ |
|
function toDuration(value: string) { |
|
if (value.includes(':')) { |
|
const [hours, minutes, seconds] = value.split(':').map((v) => parseInt(v) || 0) |
|
return hours * 3600 + minutes * 60 + seconds |
|
} |
|
|
|
return Math.floor(extractNumbers(value)) |
|
} |
|
|
|
/* |
|
* @param {string} value - string value to convert |
|
* @param {string} type - type of the field to convert to |
|
* @returns {number|string|boolean|array} - converted value |
|
* |
|
* @example convert('12.3', 'Number') -> 12 |
|
* @example convert('1a23', 'SingleLineText') -> '1a23' |
|
* @example convert('1', 'Checkbox') -> true |
|
*/ |
|
export function convert(value: string, type: string, limit = 100): unknown { |
|
switch (type) { |
|
case UITypes.SingleLineText: |
|
case UITypes.SingleSelect: |
|
case UITypes.LongText: |
|
case UITypes.Email: |
|
case UITypes.URL: |
|
return value |
|
case UITypes.Number: |
|
return Math.floor(extractNumbers(value)) |
|
case UITypes.Decimal: |
|
case UITypes.Currency: |
|
return extractNumbers(value) |
|
case UITypes.Percent: |
|
case UITypes.Rating: |
|
return Math.min(limit, Math.max(0, extractNumbers(value))) |
|
case UITypes.Checkbox: |
|
return getCheckboxValue(value) |
|
case UITypes.Date: |
|
case UITypes.DateTime: |
|
case UITypes.Time: |
|
return new Date(value) |
|
case UITypes.Duration: |
|
return toDuration(value) |
|
case UITypes.MultiSelect: |
|
return value.split(',').map((v) => v.trim()) |
|
} |
|
}
|
|
|