Dynamic value in QuickFilter

Hello. I need to create a QuickFilter on a Freedom UI Page whose value will change dynamically. I found a post https://customerfx.com/article/using-custom-attributes-on-a-creatio-fre… so I try to use the attribute but it does not work. Could you help me please?

{
    "filterType": 1,
    "comparisonType": 3,
    "isEnabled": true,
    "trimDateTimeParameterToDate": false,
    "leftExpression": {
        "expressionType": 0,
        "columnPath": "MyColumn"
    },
    "isAggregative": false,
    "dataValueType": 1,
    "rightExpression": {
        "expressionType": 2,
        "parameter": {
            "dataValueType": 1,
            "value": "$MyAttribute"
        }
    }
}
Like 0

Like

3 comments

Hello,
It seems that the attributes will not work properly with the filter, as an alternative I can suggest applying the full filter in a handler where you can change it as you want, for example:

		handlers: /**SCHEMA_HANDLERS*/[
          {
            request: "crt.HandleViewModelAttributeChangeRequest",
            handler: async (request, next) => {
            	const result = await next?.handle(request);
            	request.$context.DataGrid_7cyakqc_PredefinedFilter={"items": {
								"1893734f-7c93-40a5-9592-8e7231005e10": {
									"filterType": 1,
									"comparisonType": 7,
									"isEnabled": true,
									"trimDateTimeParameterToDate": false,
									"leftExpression": {
										"expressionType": 0,
										"columnPath": "Age"
									},
									"isAggregative": false,
									"dataValueType": 4,
									"rightExpression": {
										"expressionType": 2,
										"parameter": {
											"dataValueType": 4,
											"value": 20
										}
									}
								}
							},
							"logicalOperation": 0,
							"isEnabled": true,
							"filterType": 6,
							"rootSchemaName": "Contact"};
            	return result;
              }
          }
        ]

Dmytro Vovchenko,

Hi, Where do I store the attributes for this predefined element? Do I have to create an attribute and bind it to the element?

Hi,

Attributes on a Freedom UI page should be declared in the page schema (viewModelConfigDiff -> attributes). If you want the filter value to be dynamic, you create an attribute and (optionally) bind it to an input, but the filter JSON itself will not automatically resolve $Attribute. Instead, just like in Dmytro’s example, you apply the filter programmatically in a handler and use the attribute’s value there.

For example, declare the attribute:

viewModelConfigDiff: [
 {
   "operation": "merge",
   "path": ["attributes"],
   "values": {
     "MyFilterValue": { "value": "" }
   }
 }
]

And then in the handler:

handler: async (request, next) => {
 const result = await next?.handle(request);
 const term = await request.$context.MyFilterValue;
 request.$context.DataGrid_7cyakqc_PredefinedFilter = {
   "items": {
     "1893734f-7c93-40a5-9592-8e7231005e10": {
       // same structure as in Dmytro’s code,
       // but instead of a constant value we use the attribute
       "rightExpression": {
         "expressionType": 2,
         "parameter": {
           "dataValueType": 4,
           "value": term
         }
       }
     }
   },
   "logicalOperation": 0,
   "isEnabled": true,
   "filterType": 6,
   "rootSchemaName": "Contact"
 };
 return result;
}
 

Show all comments