diff --git a/packages/core/client/src/application/globalOperators.js b/packages/core/client/src/application/globalOperators.js index 57b5ae7a11..ce8f265eb1 100644 --- a/packages/core/client/src/application/globalOperators.js +++ b/packages/core/client/src/application/globalOperators.js @@ -167,7 +167,7 @@ export function getOperators() { const dateA = parseDate(a); const dateB = parseDate(b); if (!dateA || !dateB) { - throw new Error('Invalid date format'); + return false; } return dateA < dateB; }, @@ -651,10 +651,11 @@ function parseYear(dateStr) { } function parseDate(targetDateStr) { - let dateStr = Array.isArray(targetDateStr) ? targetDateStr[1] : targetDateStr; - if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(dateStr)) { - // ISO 8601 格式:YYYY-MM-DDTHH:mm:ss.sssZ - return new Date(dateStr); // 直接解析为 Date 对象 + let dateStr = Array.isArray(targetDateStr) ? targetDateStr[1] ?? targetDateStr[0] : targetDateStr; + if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(dateStr)) { + return new Date(dateStr); + } else if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(dateStr)) { + return new Date(dateStr.replace(' ', 'T')); } else if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) { // YYYY-MM-DD 格式 return parseFullDate(dateStr); @@ -668,5 +669,6 @@ function parseDate(targetDateStr) { // YYYY 格式 return parseYear(dateStr); } - return null; // Invalid format + + return null; } diff --git a/packages/core/client/src/schema-component/common/utils/uitls.tsx b/packages/core/client/src/schema-component/common/utils/uitls.tsx index ec2405dda5..da649cb785 100644 --- a/packages/core/client/src/schema-component/common/utils/uitls.tsx +++ b/packages/core/client/src/schema-component/common/utils/uitls.tsx @@ -7,7 +7,7 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { dayjs, getPickerFormat, Handlebars } from '@nocobase/utils/client'; +import { dayjs, getPickerFormat, Handlebars, getFormatFromDateStr } from '@nocobase/utils/client'; import _, { every, findIndex, some } from 'lodash'; import { replaceVariableValue } from '../../../block-provider/hooks'; import { VariableOption, VariablesContextType } from '../../../variables/types'; @@ -145,7 +145,15 @@ const processCondition = async ( const processAdvancedCondition = async (condition, variables, localVariables, jsonLogic) => { const operator = condition.op; const rightValue = await parseVariableValue(condition.rightVar, variables, localVariables); - const leftValue = await parseVariableValue(condition.leftVar, variables, localVariables); + let leftValue = await parseVariableValue(condition.leftVar, variables, localVariables); + const leftCollectionField = await variables.getCollectionField(condition.leftVar, localVariables); + if ( + leftValue && + ['datetime', 'date', 'datetimeNoTz', 'dateOnly', 'unixTimestamp'].includes(leftCollectionField.type) + ) { + const format = getFormatFromDateStr(rightValue); + leftValue = dayjs.utc(leftValue).local().format(format); + } if (operator) { return jsonLogic.apply({ [operator]: [leftValue, rightValue] }); } diff --git a/packages/core/utils/src/date.ts b/packages/core/utils/src/date.ts index d082c06f70..1baf179e1f 100644 --- a/packages/core/utils/src/date.ts +++ b/packages/core/utils/src/date.ts @@ -236,3 +236,13 @@ export const getDateTimeFormat = (picker, format, showTime, timeFormat) => { } return format; }; + +export function getFormatFromDateStr(dateStr: string): string | null { + if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(dateStr)) return 'YYYY-MM-DD HH:mm:ss'; + if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return 'YYYY-MM-DD'; + if (/^\d{4}-\d{2}$/.test(dateStr)) return 'YYYY-MM'; + if (/^\d{4}$/.test(dateStr)) return 'YYYY'; + if (/^\d{4}Q[1-4]$/.test(dateStr)) return 'YYYY[Q]Q'; + if (/^\d{4}-\d{2}-\d{2}T/.test(dateStr)) return 'YYYY-MM-DDTHH:mm:ss.SSSZ'; + return null; +} diff --git a/packages/plugins/@nocobase/plugin-action-duplicate/src/client/__e2e__/schemaSettings.test.ts b/packages/plugins/@nocobase/plugin-action-duplicate/src/client/__e2e__/schemaSettings.test.ts index 0b4b86d3f2..5f950ccea9 100644 --- a/packages/plugins/@nocobase/plugin-action-duplicate/src/client/__e2e__/schemaSettings.test.ts +++ b/packages/plugins/@nocobase/plugin-action-duplicate/src/client/__e2e__/schemaSettings.test.ts @@ -55,6 +55,7 @@ test.describe('direct duplicate & copy into the form and continue to fill in', ( await page.getByRole('menuitem', { name: 'oneToMany' }).click(); await page.getByRole('menuitem', { name: 'manyToOne', exact: true }).click(); await page.getByRole('menuitem', { name: 'manyToMany' }).click(); + await page.mouse.move(300, 0); await page.getByLabel('schema-initializer-ActionBar-createForm:configureActions-general').click(); await page.getByRole('menuitem', { name: 'Submit' }).click(); await page.getByLabel('drawer-Action.Container-general-Duplicate-mask').click();