mydomain
No ADS
No ADS

FlutterArtist FilterModelStructure ex2

  1. registerFilterModelStructure
  2. specifyDefaultValueForMultiOptTildeCriterion()
Note: The article you are viewing is example Demo59b, a minor upgrade from example Demo59a, which adds some configurations so that TildeFilterCriterion(s) are set to default values instead of manual user operations on the FilterPanel.
You see, when you select a new Company, the list of Department(s) will change accordingly, and a particular Department will be selected by default.
No ADS
Similar to example Demo59a, the following is the Field-Based JSON structure you will receive to send to the server for querying and filtering employees.
{
    "connector": "AND",
    "conditions": [
        {
            "field": "searchText",
            "operator": "containsIgnoreCase",
            "value": null
        },
        {
            "connector": "OR",
            "conditions": [
                {
                    "field": "departmentId",
                    "operator": "equalTo",
                    "value": 4
                },
                {
                    "field": "departmentId",
                    "operator": "equalTo",
                    "value": 3
                }
            ]
        }
    ]
}

1. registerFilterModelStructure

First, let's look at the complete code for the defineFilterModelStructure() method.
Employee59bFilterModel.defineFilterModelStructure()
@override
FilterModelStructure defineFilterModelStructure() {
  return FilterModelStructure(
    criteriaStructure: FilterCriteriaStructure(
      simpleCriterionDefs: [
        SimpleFilterCriterionDef<String>(criterionBaseName: "searchText"),
      ],
      multiOptCriterionDefs: [
        // Multi Options Single Selection Criterion.
        MultiOptFilterCriterionDef<CompanyInfo>.singleSelection(
          criterionBaseName: "company",
          fieldName: 'companyId',
          toFieldValue: (CompanyInfo? rawValue) {
            return SimpleVal.ofInt(rawValue?.id);
          },
          tildeCriterionConfigs: [
            TildeCriterionConfig(
              suffix: '~1', // company~1
              defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
            ),
            TildeCriterionConfig(
              suffix: '~2', // company~2
              defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
            ),
          ],
          children: [
            // Multi Options Single Selection Criterion.
            MultiOptFilterCriterionDef<DepartmentInfo>.singleSelection(
              criterionBaseName: "department",
              fieldName: 'departmentId',
              toFieldValue: (DepartmentInfo? rawValue) {
                return SimpleVal.ofInt(rawValue?.id);
              },
              tildeCriterionConfigs: [
                TildeCriterionConfig(
                  suffix: '~1', // department~1
                  defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
                ),
              ],
            ),
          ],
        ),
      ],
    ),
    conditionStructure: FilterConditionStructure(
      connector: FilterConnector.and,
      conditionDefs: [
        FilterConditionDef.simple(
          tildeCriterionName: "searchText~",
          operator: FilterOperator.containsIgnoreCase,
        ),
        FilterConditionDef.group(
          groupName: 'G2',
          connector: FilterConnector.or,
          conditionDefs: [
            FilterConditionDef.simple(
              tildeCriterionName: "department~1",
              operator: FilterOperator.equalTo,
            ),
            FilterConditionDef.simple(
              tildeCriterionName: "department~2",
              operator: FilterOperator.equalTo,
            ),
          ],
        ),
      ],
    ),
  );
}
tildeCriterionConfigs
Similar to example Demo59a, there will be two TildeCriterion(s) - "company~1" and "company~2" created based on the Criterion("company") blueprint.
No ADS
And here's how to configure the two TildeCriterion(s) mentioned above:
MultiOptCriterionDef<CompanyInfo>
MultiOptFilterCriterionDef<CompanyInfo>.singleSelection(
  criterionBaseName: "company",
  fieldName: 'companyId',
  toFieldValue: (CompanyInfo? rawValue) {
    return SimpleVal.ofInt(rawValue?.id);
  },
  tildeCriterionConfigs: [
    TildeCriterionConfig(
      suffix: '~1', // company~1
      defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
    ),
    TildeCriterionConfig(
      suffix: '~2', // company~2
      defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
    ),
  ],
  ...
}
By default, TildeFilterCriterion(s) are only assigned default values the first time they are initialized. In other words, their default configuration is like this:
(Default Configs)
tildeCriterionConfigs: [
  TildeCriterionConfig(
    suffix: '~1', // company~1
    defaultSettingPolicy: DefaultSettingPolicy.onInitialOnly,
    parentMatchSuffix: null,
  ),
  TildeCriterionConfig(
    suffix: '~2', // company~2
    defaultSettingPolicy: DefaultSettingPolicy.onInitialOnly,
    parentMatchSuffix: null,
  ),
],
Similarly, we configure TildeFilterCriterion("department~1"). Note: TildeFilterCriterion("department~2") is not provided with a configuration, so the default configuration will be applied to it.
MultiOptTildeCriterionDef<DepartmentInfo>
MultiOptTildeCriterionDef<DepartmentInfo>.singleSelection(
  criterionBaseName: "department",
  fieldName: 'departmentId',
  toFieldValue: (DepartmentInfo? rawValue) {
    return SimpleVal.ofInt(rawValue?.id);
  },
  tildeCriterionConfigs: [
    TildeCriterionConfig(
      suffix: '~1', // department~1
      defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
    ),
  ],
),
With the above configuration, whenever company~1 changes, department~1 will have a default value, while if company~2 changes, department~2 will be null.

2. specifyDefaultValueForMultiOptTildeCriterion()

After the data is loaded for each MultiOptTildeFilterCriterion, the assignment of a default value is determined by the specifyDefaultValueForMultiOptTildeCriterion() method:
specifyDefaultValueForMultiOptTildeCriterion()
@override
OptValueWrap? specifyDefaultValueForMultiOptTildeCriterion({
  required String multiOptTildeCriterionName,
  required String multiOptCriterionBaseName,
  required Object? parentMultiOptTildeCriterionValue,
  required SelectionType selectionType,
  required XData multiOptTildeCriterionXData,
}) {
  if (multiOptCriterionBaseName == "company") {
    var xList = multiOptTildeCriterionXData as ListXData<int, CompanyInfo>;
    CompanyInfo? companyInfo = xList.items.firstOrNull;
    return OptValueWrap.single(companyInfo);
  } else if (multiOptCriterionBaseName == "department") {
    var xList = multiOptTildeCriterionXData as ListXData<int, DepartmentInfo>;
    DepartmentInfo? departmentInfo = xList.items.firstOrNull;
    return OptValueWrap.single(departmentInfo);
  }
  return null;
}
No ADS

FlutterArtist

Show More
No ADS