diff --git a/src/qqq/components/query/FilterCriteriaRow.tsx b/src/qqq/components/query/FilterCriteriaRow.tsx index ff6dd2d..1f4049c 100644 --- a/src/qqq/components/query/FilterCriteriaRow.tsx +++ b/src/qqq/components/query/FilterCriteriaRow.tsx @@ -45,7 +45,9 @@ export enum ValueMode DOUBLE = "DOUBLE", MULTI = "MULTI", SINGLE_DATE = "SINGLE_DATE", + DOUBLE_DATE = "DOUBLE_DATE", SINGLE_DATE_TIME = "SINGLE_DATE_TIME", + DOUBLE_DATE_TIME = "DOUBLE_DATE_TIME", PVS_SINGLE = "PVS_SINGLE", PVS_MULTI = "PVS_MULTI", } @@ -164,6 +166,8 @@ export function FilterCriteriaRow({id, index, tableMetaData, metaData, criteria, operatorOptions.push({label: "is on or before", value: QCriteriaOperator.LESS_THAN_OR_EQUALS, valueMode: ValueMode.SINGLE_DATE}); operatorOptions.push({label: "is empty", value: QCriteriaOperator.IS_BLANK, valueMode: ValueMode.NONE}); operatorOptions.push({label: "is not empty", value: QCriteriaOperator.IS_NOT_BLANK, valueMode: ValueMode.NONE}); + operatorOptions.push({label: "is between", value: QCriteriaOperator.BETWEEN, valueMode: ValueMode.DOUBLE_DATE}); + operatorOptions.push({label: "is not between", value: QCriteriaOperator.NOT_BETWEEN, valueMode: ValueMode.DOUBLE_DATE}); //? operatorOptions.push({label: "is between", value: QCriteriaOperator.BETWEEN}); //? operatorOptions.push({label: "is not between", value: QCriteriaOperator.NOT_BETWEEN}); //? operatorOptions.push({label: "is any of", value: QCriteriaOperator.IN}); @@ -178,6 +182,8 @@ export function FilterCriteriaRow({id, index, tableMetaData, metaData, criteria, operatorOptions.push({label: "is at or before", value: QCriteriaOperator.LESS_THAN_OR_EQUALS, valueMode: ValueMode.SINGLE_DATE_TIME}); operatorOptions.push({label: "is empty", value: QCriteriaOperator.IS_BLANK, valueMode: ValueMode.NONE}); operatorOptions.push({label: "is not empty", value: QCriteriaOperator.IS_NOT_BLANK, valueMode: ValueMode.NONE}); + operatorOptions.push({label: "is between", value: QCriteriaOperator.BETWEEN, valueMode: ValueMode.DOUBLE_DATE_TIME}); + operatorOptions.push({label: "is not between", value: QCriteriaOperator.NOT_BETWEEN, valueMode: ValueMode.DOUBLE_DATE_TIME}); //? operatorOptions.push({label: "is between", value: QCriteriaOperator.BETWEEN}); //? operatorOptions.push({label: "is not between", value: QCriteriaOperator.NOT_BETWEEN}); break; diff --git a/src/qqq/components/query/FilterCriteriaRowValues.tsx b/src/qqq/components/query/FilterCriteriaRowValues.tsx index b0a70e7..8be4182 100644 --- a/src/qqq/components/query/FilterCriteriaRowValues.tsx +++ b/src/qqq/components/query/FilterCriteriaRowValues.tsx @@ -131,7 +131,7 @@ function FilterCriteriaRowValues({operatorOption, criteria, field, table, valueC />; }; - const makeDateTimeExpressionTextField = (value: string, valueIndex: number = 0, label = "Value", idPrefix = "value-") => + const makeDateTimeExpressionTextField = (expression: any, valueIndex: number = 0, label = "Value", idPrefix = "value-") => { const clearValue = (event: React.MouseEvent | React.MouseEvent, index: number) => { @@ -143,23 +143,120 @@ function FilterCriteriaRowValues({operatorOption, criteria, field, table, valueC const inputProps: any = {}; inputProps.endAdornment = ( - clearValue(event, valueIndex)}> + clearValue(event, valueIndex)}> close ); + let displayValue = expression.toString(); + if (expression?.type == "ThisOrLastPeriod") + { + if(field.type == QFieldType.DATE_TIME || (field.type == QFieldType.DATE && expression.timeUnit != "DAYS")) + { + displayValue = "start of " + displayValue; + } + } + return ; } + const makeDateField = (valueIndex: number = 0, label = "Value", idPrefix = "value-") => + { + return + { + criteria.expression == null && makeTextField(valueIndex, label, idPrefix) + } + { + criteria.expression != null && makeDateTimeExpressionTextField(criteria.expression, valueIndex, label, idPrefix) + } + + + date_range + + + setExpressionNowWithOffset(valueIndex, "MINUS", 1, "DAYS")}>1 day ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "DAYS")}>today + setExpressionThisOrLastPeriod(valueIndex, "LAST", "DAYS")}>yesterday + setExpressionNowWithOffset(valueIndex, "MINUS", 7, "DAYS")}>7 days ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "WEEKS")}>start of this week + setExpressionThisOrLastPeriod(valueIndex, "LAST", "WEEKS")}>start of last week + setExpressionNowWithOffset(valueIndex, "MINUS", 14, "DAYS")}>14 days ago + setExpressionNowWithOffset(valueIndex, "MINUS", 30, "DAYS")}>30 days ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "MONTHS")}>start of this month + setExpressionThisOrLastPeriod(valueIndex, "LAST", "MONTHS")}>start of last month + setExpressionNowWithOffset(valueIndex, "MINUS", 90, "DAYS")}>90 days ago + setExpressionNowWithOffset(valueIndex, "MINUS", 180, "DAYS")}>180 days ago + setExpressionNowWithOffset(valueIndex, "MINUS", 1, "YEARS")}>1 year ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "YEARS")}>start of this year + setExpressionThisOrLastPeriod(valueIndex, "LAST", "YEARS")}>start of last year + + + + saveNewDateTimeExpression(valueIndex, expression)} /> + + ; + } + + const makeDateTimeField = (valueIndex: number = 0, label = "Value", idPrefix = "value-") => + { + return + { + criteria.expression == null && makeTextField(valueIndex, label, idPrefix) + } + { + criteria.expression != null && makeDateTimeExpressionTextField(criteria.expression, valueIndex, label, idPrefix) + } + + + date_range + + + setExpressionNowWithOffset(valueIndex, "MINUS", 1, "HOURS")}>1 hour ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "HOURS")}>start of this hour + setExpressionThisOrLastPeriod(valueIndex, "LAST", "HOURS")}>start of last hour + setExpressionNowWithOffset(valueIndex, "MINUS", 12, "HOURS")}>12 hours ago + setExpressionNowWithOffset(valueIndex, "MINUS", 24, "HOURS")}>24 hours ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "DAYS")}>start of today + setExpressionThisOrLastPeriod(valueIndex, "LAST", "DAYS")}>start of yesterday + setExpressionNowWithOffset(valueIndex, "MINUS", 7, "DAYS")}>7 days ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "WEEKS")}>start of this week + setExpressionThisOrLastPeriod(valueIndex, "LAST", "WEEKS")}>start of last week + setExpressionNowWithOffset(valueIndex, "MINUS", 14, "DAYS")}>14 days ago + setExpressionNowWithOffset(valueIndex, "MINUS", 30, "DAYS")}>30 days ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "MONTHS")}>start of this month + setExpressionThisOrLastPeriod(valueIndex, "LAST", "MONTHS")}>start of last month + setExpressionNowWithOffset(valueIndex, "MINUS", 90, "DAYS")}>90 days ago + setExpressionNowWithOffset(valueIndex, "MINUS", 180, "DAYS")}>180 days ago + setExpressionNowWithOffset(valueIndex, "MINUS", 1, "YEARS")}>1 year ago + setExpressionThisOrLastPeriod(valueIndex, "THIS", "YEARS")}>start of this year + setExpressionThisOrLastPeriod(valueIndex, "LAST", "YEARS")}>start of last year + + + + saveNewDateTimeExpression(valueIndex, expression)} /> + + ; + } + function saveNewPasterValues(newValues: any[]) { if (criteria.values) @@ -193,34 +290,34 @@ function FilterCriteriaRowValues({operatorOption, criteria, field, table, valueC setRelativeDateTimeMenuAnchorElement(null); }; - const setExpressionNowWithOffset = (operator: NowWithOffsetOperator, amount: number, timeUnit: NowWithOffsetUnit) => + const setExpressionNowWithOffset = (valueIndex: number, operator: NowWithOffsetOperator, amount: number, timeUnit: NowWithOffsetUnit) => { const expression = new NowWithOffsetExpression() expression.operator = operator; expression.amount = amount; expression.timeUnit = timeUnit; - saveNewDateTimeExpression(expression); + saveNewDateTimeExpression(valueIndex, expression); closeRelativeDateTimeMenu(); }; - const setExpressionThisOrLastPeriod = (operator: ThisOrLastPeriodOperator, timeUnit: ThisOrLastPeriodUnit) => + const setExpressionThisOrLastPeriod = (valueIndex: number, operator: ThisOrLastPeriodOperator, timeUnit: ThisOrLastPeriodUnit) => { const expression = new ThisOrLastPeriodExpression() expression.operator = operator; expression.timeUnit = timeUnit; - saveNewDateTimeExpression(expression); + saveNewDateTimeExpression(valueIndex, expression); closeRelativeDateTimeMenu(); }; - function saveNewDateTimeExpression(expression: any) + function saveNewDateTimeExpression(valueIndex: number, expression: any) { criteria.expression = expression; criteria.values = null; - valueChangeHandler(null, null, null, expression); + valueChangeHandler(null, valueIndex, null, expression); forceUpdate(); } @@ -231,87 +328,14 @@ function FilterCriteriaRowValues({operatorOption, criteria, field, table, valueC case ValueMode.SINGLE: return makeTextField(); case ValueMode.SINGLE_DATE: - return - { - criteria.expression == null && makeTextField() - } - { - criteria.expression != null && makeDateTimeExpressionTextField(criteria.expression.toString()) - } - - - event_upcoming - - - setExpressionNowWithOffset("MINUS", 1, "DAYS")}>1 day ago - setExpressionThisOrLastPeriod("THIS", "DAYS")}>today - setExpressionThisOrLastPeriod("LAST", "DAYS")}>yesterday - setExpressionNowWithOffset("MINUS", 7, "DAYS")}>7 days ago - setExpressionThisOrLastPeriod("THIS", "WEEKS")}>start of this week - setExpressionThisOrLastPeriod("LAST", "WEEKS")}>start of last week - setExpressionNowWithOffset("MINUS", 14, "DAYS")}>14 days ago - setExpressionNowWithOffset("MINUS", 30, "DAYS")}>30 days ago - setExpressionThisOrLastPeriod("THIS", "MONTHS")}>start of this month - setExpressionThisOrLastPeriod("LAST", "MONTHS")}>start of last month - setExpressionNowWithOffset("MINUS", 90, "DAYS")}>90 days ago - setExpressionNowWithOffset("MINUS", 180, "DAYS")}>180 days ago - setExpressionNowWithOffset("MINUS", 1, "YEARS")}>1 year ago - setExpressionThisOrLastPeriod("THIS", "YEARS")}>start of this year - setExpressionThisOrLastPeriod("LAST", "YEARS")}>start of last year - - - - saveNewDateTimeExpression(expression)} /> - - ; + return makeDateField(); + case ValueMode.DOUBLE_DATE: + return + {makeDateField(0, "From", "from-")} + {makeDateField(1, "To", "to-")} + case ValueMode.SINGLE_DATE_TIME: - return - { - criteria.expression == null && makeTextField() - } - { - criteria.expression != null && makeDateTimeExpressionTextField(criteria.expression.toString()) - } - - - event_upcoming - - - setExpressionNowWithOffset("MINUS", 1, "HOURS")}>1 hour ago - setExpressionThisOrLastPeriod("THIS", "HOURS")}>start of this hour - setExpressionThisOrLastPeriod("LAST", "HOURS")}>start of last hour - setExpressionNowWithOffset("MINUS", 12, "HOURS")}>12 hours ago - setExpressionNowWithOffset("MINUS", 24, "HOURS")}>24 hours ago - setExpressionThisOrLastPeriod("THIS", "DAYS")}>start of today - setExpressionThisOrLastPeriod("LAST", "DAYS")}>start of yesterday - setExpressionNowWithOffset("MINUS", 7, "DAYS")}>7 days ago - setExpressionThisOrLastPeriod("THIS", "WEEKS")}>start of this week - setExpressionThisOrLastPeriod("LAST", "WEEKS")}>start of last week - setExpressionNowWithOffset("MINUS", 14, "DAYS")}>14 days ago - setExpressionNowWithOffset("MINUS", 30, "DAYS")}>30 days ago - setExpressionThisOrLastPeriod("THIS", "MONTHS")}>start of this month - setExpressionThisOrLastPeriod("LAST", "MONTHS")}>start of last month - setExpressionNowWithOffset("MINUS", 90, "DAYS")}>90 days ago - setExpressionNowWithOffset("MINUS", 180, "DAYS")}>180 days ago - setExpressionNowWithOffset("MINUS", 1, "YEARS")}>1 year ago - setExpressionThisOrLastPeriod("THIS", "YEARS")}>start of this year - setExpressionThisOrLastPeriod("LAST", "YEARS")}>start of last year - - - - saveNewDateTimeExpression(expression)} /> - - ; + return makeDateTimeField(); case ValueMode.DOUBLE: return