From d9b972be1b594c4e934aa5f7f53eaf70113d3fa6 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Fri, 8 Jul 2022 20:00:08 +0800 Subject: [PATCH] feat: WEEKDAY validation --- .../components/editColumn/FormulaOptions.vue | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui/components/project/spreadsheet/components/editColumn/FormulaOptions.vue b/packages/nc-gui/components/project/spreadsheet/components/editColumn/FormulaOptions.vue index fbe89f8159..e9cb8f61b0 100644 --- a/packages/nc-gui/components/project/spreadsheet/components/editColumn/FormulaOptions.vue +++ b/packages/nc-gui/components/project/spreadsheet/components/editColumn/FormulaOptions.vue @@ -108,7 +108,6 @@ export default { props: ['nodes', 'column', 'meta', 'isSQLite', 'alias', 'value', 'sqlUi'], data: () => ({ formula: {}, - // formulas: ['AVERAGE()', 'COUNT()', 'COUNTA()', 'COUNTALL()', 'SUM()', 'MIN()', 'MAX()', 'AND()', 'OR()', 'TRUE()', 'FALSE()', 'NOT()', 'XOR()', 'ISERROR()', 'IF()', 'LEN()', 'MID()', 'LEFT()', 'RIGHT()', 'FIND()', 'CONCATENATE()', 'T()', 'VALUE()', 'ARRAYJOIN()', 'ARRAYUNIQUE()', 'ARRAYCOMPACT()', 'ARRAYFLATTEN()', 'ROUND()', 'ROUNDUP()', 'ROUNDDOWN()', 'INT()', 'EVEN()', 'ODD()', 'MOD()', 'LOG()', 'EXP()', 'POWER()', 'SQRT()', 'CEILING()', 'FLOOR()', 'ABS()', 'RECORD_ID()', 'CREATED_TIME()', 'ERROR()', 'BLANK()', 'YEAR()', 'MONTH()', 'DAY()', 'HOUR()', 'MINUTE()', 'SECOND()', 'TODAY()', 'NOW()', 'WORKDAY()', 'DATETIME_PARSE()', 'DATETIME_FORMAT()', 'SET_LOCALE()', 'SET_TIMEZONE()', 'DATESTR()', 'TIMESTR()', 'TONOW()', 'FROMNOW()', 'DATEADD()', 'WEEKDAY()', 'WEEKNUM()', 'DATETIME_DIFF()', 'WORKDAY_DIFF()', 'IS_BEFORE()', 'IS_SAME()', 'IS_AFTER()', 'REPLACE()', 'REPT()', 'LOWER()', 'UPPER()', 'TRIM()', 'SUBSTITUTE()', 'SEARCH()', 'SWITCH()', 'LAST_MODIFIED_TIME()', 'ENCODE_URL_COMPONENT()', 'REGEX_EXTRACT()', 'REGEX_MATCH()', 'REGEX_REPLACE()'] availableFunctions: formulaList, availableBinOps: ['+', '-', '*', '/', '>', '<', '==', '<=', '>=', '!='], autocomplete: false, @@ -257,7 +256,39 @@ export default { if (parsedTree.callee.type === jsep.IDENTIFIER) { const expectedType = formulas[parsedTree.callee.name].type; if (expectedType === formulaTypes.NUMERIC) { - parsedTree.arguments.map(arg => this.validateAgainstType(arg, expectedType, null, typeErrors)); + if (parsedTree.callee.name === 'WEEKDAY') { + // parsedTree.arguments[0] = date + this.validateAgainstType( + parsedTree.arguments[0], + formulaTypes.DATE, + v => { + if (!(v instanceof Date)) { + typeErrors.add('The first parameter of WEEKDAY() should have date value'); + } + }, + typeErrors + ); + // parsedTree.arguments[1] = startDayOfWeek (optional) + this.validateAgainstType( + parsedTree.arguments[1], + formulaTypes.STRING, + v => { + if ( + typeof v !== 'string' || + !['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'].includes( + v.toLowerCase() + ) + ) { + typeErrors.add( + 'The second parameter of WEEKDAY() should have the value either "sunday", "monday", "tuesday", "wednesday", "thursday", "friday" or "saturday"' + ); + } + }, + typeErrors + ); + } else { + parsedTree.arguments.map(arg => this.validateAgainstType(arg, expectedType, null, typeErrors)); + } } else if (expectedType === formulaTypes.DATE) { if (parsedTree.callee.name === 'DATEADD') { // parsedTree.arguments[0] = date