Skip to content
This repository has been archived by the owner on Mar 31, 2022. It is now read-only.

Generic filter improvements #196

Closed
12 tasks done
GlebDurygin opened this issue Dec 14, 2020 · 6 comments
Closed
12 tasks done

Generic filter improvements #196

GlebDurygin opened this issue Dec 14, 2020 · 6 comments
Assignees
Milestone

Comments

@GlebDurygin
Copy link
Contributor

GlebDurygin commented Dec 14, 2020

The main issue #162

List of remaining tasks:

Filter actions

  • Implement FilterMakeDefaultAction class;
  • Implement FilterSaveWithValuesAction class;

Features

  • Add parameterWhere, parameterJoin, parameterFetchPlan attributes;
  • Jpql conditions;
  • Use filter with dynamic attributes;
  • Condition validation
  • Security

XML

  • Add <jpqlFilter/> XML element;
  • Add captionPosition attribute to Filter component

Filter appearance

  • Remove unused CUBA styles from Filter component;
  • Use theme constants in screens;

Events

  • ConfigurationChangeEvent

Solution

Filter components

The generic filter component can only work with components that implement the FilterComponent interface. If the component is a container for placing multiple filter components, then it needs to implement LogicalFilterComponent interface.

Untitled Diagram

The filter component is treated as a query condition:

FilterComponent Query condition
PropertyFilter PropertyCondition
JpqlFilter JpqlCondition
GroupFilter LogicalCondition

GroupFilter

The GroupFilter component is a composite component that has a GroupBoxLayout component as its root container. This component is needed to combine several conditions into a logical group (AND by default, OR). The component can be used only inside the Filter component.

PropertyFilter

See #29, #171
PropertyFilter is a UI component used for filtering entities returned by the {@link DataLoader}. The component is related to entity property and can automatically render proper layout for setting a condition value. In general case a PropertyFilter layout contains a label with entity property caption, operation label or selector (=, contains, >, etc.) and a field for editing a property value. The component can be used inside the Filter component and independently.

<propertyFilter property="name"
               operation="CONTAINS"
               operationEditable="false">
   <textField id="nameFilterValueComponent"/>
</propertyFilter>
<propertyFilter property="age"
               operation="GREATER"
               operationEditable="true">
</propertyFilter>

propertyFilter attributes inside the filter:

  • id
  • property (required) May be a property or properties path: name, order, order.date
  • operation (required)
  • operationEditable Default false
  • operationCaptionVisible Default true.
  • caption (optional) If absent, the caption is evaluated by entity property
  • width
  • parameterName - name of LoadContext parameter that is used by this condition. If not defined then the parameter name is randomly generated.
  • defaultValue - the default value of filter component

JpqlFilter

JpqlFilter is a UI component used for filtering entities returned by the DataLoader. The component contains JPQL expressions that will be added to the 'from' and 'where' data loader query sections. The component can automatically render proper layout for setting a condition value. In general case a JpqlFilter layout contains a label with caption and a field for editing a condition value. The component can be used only inside the Filter component.

<jpqlFilter caption="Name like"
            parameterClass="java.lang.String"
            defaultValue="John">
    <condition>
        <c:jpql>
            <c:where>{E}.name like ?</c:where>
        </c:jpql>
    </condition>
</jpqlFilter>

jpqlFilter attributes inside the filter:

  • id
  • parameterClass (required) the value type
  • parameterName - name of LoadContext parameter that is used by this condition. If not defined then the parameter name is randomly generated.
  • caption (optional) If absent, the caption is evaluated by entity property
  • width
  • defaultValue - the default value of filter component

Filter component registration

See FilterComponentRegistration class. The FilterComponentRegistration class has the following attributes:

  • componentClass (required) - filter component class, must extend from FilterComponent class;
  • modelClass (required) - non-persistent entity class that stores the state of the filter component, must extend from FilterCondition class. The model class is used to save filter component state in DB and is used to display and change the state of the filter component at runtime;
  • converterClass (required) - a converter class for converting between a component and a model must implement the FilterConverter interface.
  • editorScreenId (optional) - ID of the model edit screen. If no identifier is specified then the default identifier (modelName.edit -> PropertyFilterCondition.edit) will be used.
    PropertyFilter registration example:
    @Bean
    public FilterComponentRegistration registerPropertyFilter() {
        return FilterComponentRegistrationBuilder.create(PropertyFilter.class,
                PropertyFilterCondition.class,
                PropertyFilterConverter.class)
                .withEditScreenId("ui_PropertyFilterCondition.edit")
                .build();
    }

All registered filter components are displayed in a PopupButton on the AddConditionScreen so that the user has the opportunity to create a filter component in runtime. Pressing the button will open the editor screen for the selected filter component.
image

This method of registering filter components is convenient because we can register the filter components in different modules. And also the user can replace the filter component registered in the jmix framework with his own implementation by specifying the @Order annotation (for example, to expand the set of model attributes saved by the filter).

Configurations

A configuration is a set of filter components that has an id (required) and name (optional). The id must be unique within this filter. If the name is not specified, then id is used as a key in the messagePack.
The LogicalFilterComponent is the root element of the configuration.
The configuration does not store a reference to all components, but stores a reference only to the root element (LogicalFilterComponent) from which the rest filter components can be obtained.
Configurations can be created at design time or at run time (via filter configuration editor).
Using Filter#getCurrentConfiguration() user can get the current configuration, and using Filter#getConfiguration(String id) user can get the configuration by id.

Design-time configuration

See DesignTimeConfigurationImpl class. Such configurations cannot be changed and saved in run-time, but the user can use FilterCopyAction that copies all conditions from the design-time configuration to run-time configuration.
Configuration addConfiguration(String id, @Nullable String name) method creates and adds to filter a design-time configuration.
Use default XML attribute to set the design-time configuration as default for filter.
All design-time configurations are displayed in the selectConfigurationButton:
image

<filter id="filter" dataLoader="testChildEntitiesDl">
    <properties include=".*"/>
    <configurations>
        <configuration id="test_configuration" name="Test Configuration 1 (AND)" operation="AND">
            <propertyFilter property="testName"
                            operation="ENDS_WITH"
                            operationEditable="false"/>
            <groupFilter operation="OR">
                <propertyFilter property="testInt"
                                operation="EQUAL"
                                operationCaptionVisible="false"/>
                <propertyFilter property="testDecimal"
                                operation="LESS_OR_EQUAL"/>
            </groupFilter>
        </configuration>
        <configuration id="test_configuration_2" name="Test Configuration 2 (OR)" operation="OR">
            <propertyFilter property="testName"
                            operation="ENDS_WITH"
                            operationEditable="false"/>
            <propertyFilter property="testDecimal"
                            operation="LESS_OR_EQUAL"/>
        </configuration>
    </configurations>
</filter>

Run-time configuration

See RuntimeTimeConfigurationImpl. Such configurations are created by the user in run-time and can be saved and modified.

Predefined conditions

A predefined condition is a filter component that is not initially added to any of the configurations, but the user can select this component in the AddConditionScreen in the Predefined conditions section and add it to the run-time configuration.

<filter id="filter"
        dataLoader="testChildEntitiesDl">
    <properties include=".*"/>
    <conditions>
        <propertyFilter property="testTime"
                        operation="EQUAL"
                        operationEditable="true"
                        caption="Test time condition"/>
    </conditions>
</filter>

AddConditionScreen

The set of conditions that will be displayed in AddConditionScreen is defined using ConditionBuilder beans: PropertyConditionBuilder, PredefinedConditionBuilder, ConfigurationConditionBuilder.
image

The set of possible dropdown actions for the Create button is determined by the number of registered FilterComponents.
image

Configuration editor

image

GroupCondition editor

image

PropertyCondition editor

image

JpqlCondition editor

image

Filter actions

Now, the Filter component implements ActionsHolder interface. All actions will be added to the settingsButton PopupButton.
image

The framework loads a set of default actions for the filter, depending on the connected modules:

  • ui module

    • FilterEditAction (filter_edit)
    • FilterCopyAction (filter_copy)
    • FilterClearValuesAction (filter_clearValues)
  • ui-data module

    • FilterSaveAction (filter_save)
    • FilterSaveWithValuesAction (filter_saveWithValues)
    • FilterSaveAsAction (filter_saveAs)
    • FilterEditAction (filter_edit)
    • FilterRemoveAction (filter_remove)
    • FilterCopyAction (filter_copy)
    • FilterMakeDefaultAction (filter_makeDefault)
    • FilterClearValuesAction (filter_clearValues)

    User can override default actions in XML or in JAVA:

<filter id="filter1" dataLoader="testChildEntitiesDl">
    <properties include=".*"/>
    <actions>
        <action id="addCondition" type="filter_addCondition"/>
        <action id="edit" type="filter_edit"/>
    </actions>
</filter>
filter.removeAllActions();
FilterAction filterAction = actions.create(FilterAddCondition.class);
filterAction.setFilter(filter);
filter.addAction(filterAction);

filter_save - saves changes to current filter configuration.
filter_saveWithValues - saves changes to the current filter configuration using the values in inner filter components as filter default values.
filter_saveAs - saves current filter configuration under new code and caption;
filter_edit - edits current run-time filter configuration (opens FilterConfigurationEdit screen). Disabled for design-time configurations.
filter_remove - removes current run-time filter configuration. Disabled for design-time configurations.
filter_copy - copies all conditions from design-time configuration to run-time configuration;
filter_makeDefault - makes the filter configuration default for this screen. The filter will be automatically displayed on the filter panel when the screen is opened. Takes precedence over default attribute of design-time configurations and Default for all users attribute of configuration. Disabled if no screenSettings facet is added to the screen.
filter_clearValues - clears the filter condition values.
filter_addCondition - adds condition to current filter configuration.

Permissions

  • ui.filter.modifyConfiguration - to create/change/delete filter configurations
  • ui.filter.modifyGlobalConfiguration - to create/change/delete global (available to all users) filter configurations
  • ui.filter.modifyJpqlCondition - to create/change jpql conditions in run-time

Ui properties

  • jmix.ui.filter.autoApply - allows controlling the default search mode for the filter. autoApply attribute specifies when the filter is applied. If the attribute value is false, the filter will be applied only after the Search button is clicked. If the attribute value is true, filter is applied immediately after changing the filter components.
  • jmix.ui.filter.propertiesHierarchyDepth - defines the properties hierarchy depth in the "AddConditionScreen"
  • jmix.ui.filter.columnsCount - sets the default number of columns for placing FilterComponents on the filter panel
  • jmix.ui.filter.showConfigurationIdField - determines whether the configurationIdField should be shown in editors. By default, the configurationIdField is not shown and the configurationId is generated depending on the configurationName.

Samples

Add a design-time configuration with a PropertyFilter to a Filter
  • XML
    <filter id="filter" dataLoader="ordersDl">
        <properties include=".*"/>
        <configurations>
            <configuration id="defaultXmlConfiguration" name="msg://defaultXmlConfiguration.name" default="true">
                <propertyFilter property="customer" operation="EQUAL"
                                operationEditable="true"/>
                <propertyFilter property="customer.grade" operation="EQUAL"
                                operationEditable="true"/>
            </configuration>
        </configurations>
    </filter>
    
  • Java
    @Autowired
    protected UiComponents uiComponents;
    @Autowired
    protected SingleFilterSupport singleFilterSupport;
    @Autowired
    protected Filter filter;
    
    @Autowired
    protected Messages messages;
    
    @Subscribe
    protected void onInit(InitEvent event) {
        DesignTimeConfiguration javaDefaultConfiguration = filter.addConfiguration("javaDefaultConfiguration",
                "Default configuration");
        DataLoader dataLoader = filter.getDataLoader();
    
        PropertyFilter<Customer> customerPropertyFilter = uiComponents.create(PropertyFilter.NAME);
        customerPropertyFilter.setConditionModificationDelegated(true);
        customerPropertyFilter.setDataLoader(dataLoader);
        customerPropertyFilter.setProperty("customer");
        customerPropertyFilter.setOperation(PropertyFilter.Operation.EQUAL);
        customerPropertyFilter.setOperationEditable(true);
        customerPropertyFilter.setParameterName(PropertyConditionUtils.generateParameterName(
                customerPropertyFilter.getProperty()));
        customerPropertyFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                dataLoader.getContainer().getEntityMetaClass(),
                customerPropertyFilter.getProperty(),
                customerPropertyFilter.getOperation()
        ));
        javaDefaultConfiguration.getRootLogicalFilterComponent().add(customerPropertyFilter);
    
        PropertyFilter<CustomerGrade> gradePropertyFilter = uiComponents.create(PropertyFilter.NAME);
        gradePropertyFilter.setConditionModificationDelegated(true);
        gradePropertyFilter.setDataLoader(dataLoader);
        gradePropertyFilter.setProperty("customer.grade");
        gradePropertyFilter.setOperation(PropertyFilter.Operation.EQUAL);
        gradePropertyFilter.setOperationEditable(true);
        gradePropertyFilter.setParameterName(PropertyConditionUtils.generateParameterName(
                gradePropertyFilter.getProperty()));
        gradePropertyFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                dataLoader.getContainer().getEntityMetaClass(),
                gradePropertyFilter.getProperty(),
                gradePropertyFilter.getOperation()
        ));
        javaDefaultConfiguration.getRootLogicalFilterComponent().add(gradePropertyFilter);
        filter.setCurrentConfiguration(javaDefaultConfiguration);        
    }
    
Add a design-time configuration with a JpqlFilter to a Filter
  • XML
    <filter id="filter" dataLoader="ordersDl">
        <properties include=".*"/>
        <configurations>
            <configuration id="defaultXmlConfiguration" name="msg://defaultXmlConfiguration.name" default="true">
                <jpqlFilter caption="msg://jpqlFilter.caption"
                            parameterClass="io.jmix.sampler.entity.Product">
                    <condition>
                        <c:jpql>
                            <c:join>join {E}.items i</c:join>
                            <c:where>i.product.id = ?</c:where>
                        </c:jpql>
                    </condition>
                </jpqlFilter>
            </configuration>
        </configurations>
    </filter>
    
  • Java
    @Autowired
    protected UiComponents uiComponents;
    @Autowired
    protected JpqlFilterSupport jpqlFilterSupport;
    @Autowired
    protected SingleFilterSupport singleFilterSupport;
    @Autowired
    protected Filter filter;
    
    @Autowired
    protected Messages messages;
    
    @Subscribe
    protected void onInit(InitEvent event) {
        DesignTimeConfiguration javaDefaultConfiguration = filter.addConfiguration("javaDefaultConfiguration",
                "Default configuration");
        DataLoader dataLoader = filter.getDataLoader();
    
        JpqlFilter<Product> jpqlFilter = uiComponents.create(JpqlFilter.NAME);
        jpqlFilter.setFrame(getWindow());
        jqplFilter.setConditionModificationDelegated(true);
        jpqlFilter.setDataLoader(dataLoader);
        jpqlFilter.setCondition("i.product.id = ?", "join {E}.items i");
        jpqlFilter.setParameterClass(Product.class);
        jpqlFilter.setCaption(messages.getMessage(FilterJpqlConditionSample.class, "jpqlFilter.caption"));
        jpqlFilter.setParameterName(jpqlFilterSupport.generateParameterName(
                jpqlFilter.getId(),
                jpqlFilter.getParameterClass().getSimpleName()));
        jpqlFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                dataLoader.getContainer().getEntityMetaClass(),
                jpqlFilter.hasInExpression(),
                jpqlFilter.getParameterClass()
        ));
    
        javaDefaultConfiguration.getRootLogicalFilterComponent().add(jpqlFilter);
        filter.setCurrentConfiguration(javaDefaultConfiguration);    
    }
    
Add a design-time configuration with a GroupFilter to a Filter
  • XML
    <filter id="filter" dataLoader="customersDl">
        <properties include=".*"/>
        <configurations>
            <configuration id="defaultXmlConfiguration" name="msg://defaultXmlConfiguration.name" default="true">
                <groupFilter operation="OR">
                    <propertyFilter property="active" operation="EQUAL"
                                    operationEditable="true" defaultValue="false"/>
                    <propertyFilter property="grade" operation="EQUAL"
                                    operationEditable="true" defaultValue="30"/>
                </groupFilter>
                <propertyFilter property="age" operation="GREATER_OR_EQUAL"
                                operationEditable="true" defaultValue="30"/>
            </configuration>
        </configurations>
    </filter>
    
  • Java
    @Autowired
    protected UiComponents uiComponents;
    @Autowired
    protected SingleFilterSupport singleFilterSupport;
    @Autowired
    protected Filter filter;
    
    @Autowired
    protected Messages messages;
    
    @Subscribe
    protected void onInit(InitEvent event) {
        DesignTimeConfiguration javaDefaultConfiguration = filter.addConfiguration("javaDefaultConfiguration",
                "Default configuration");
        DataLoader dataLoader = filter.getDataLoader();
    
        GroupFilter groupFilter = uiComponents.create(GroupFilter.NAME);
        groupFilter.setConditionModificationDelegated(true);
        groupFilter.setDataLoader(dataLoader);
        groupFilter.setOperation(LogicalFilterComponent.Operation.OR);
    
        PropertyFilter<Boolean> activePropertyFilter = uiComponents.create(PropertyFilter.NAME);
        activePropertyFilter.setConditionModificationDelegated(true);
        activePropertyFilter.setDataLoader(dataLoader);
        activePropertyFilter.setProperty("active");
        activePropertyFilter.setOperation(PropertyFilter.Operation.EQUAL);
        activePropertyFilter.setOperationEditable(true);
        activePropertyFilter.setParameterName(PropertyConditionUtils.generateParameterName(
                activePropertyFilter.getProperty()));
        activePropertyFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                dataLoader.getContainer().getEntityMetaClass(),
                activePropertyFilter.getProperty(),
                activePropertyFilter.getOperation()
        ));
        groupFilter.add(activePropertyFilter);
    
        PropertyFilter<CustomerGrade> gradePropertyFilter = uiComponents.create(PropertyFilter.NAME);
        gradePropertyFilter.setConditionModificationDelegated(true);
        gradePropertyFilter.setDataLoader(dataLoader);
        gradePropertyFilter.setProperty("grade");
        gradePropertyFilter.setOperation(PropertyFilter.Operation.EQUAL);
        gradePropertyFilter.setOperationEditable(true);
        gradePropertyFilter.setParameterName(PropertyConditionUtils.generateParameterName(
                gradePropertyFilter.getProperty()));
        gradePropertyFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                dataLoader.getContainer().getEntityMetaClass(),
                gradePropertyFilter.getProperty(),
                gradePropertyFilter.getOperation()
        ));
        groupFilter.add(gradePropertyFilter);
        javaDefaultConfiguration.getRootLogicalFilterComponent().add(groupFilter);
    
        PropertyFilter<Integer> agePropertyFilter = uiComponents.create(PropertyFilter.NAME);
        agePropertyFilter.setConditionModificationDelegated(true);
        agePropertyFilter.setDataLoader(dataLoader);
        agePropertyFilter.setProperty("age");
        agePropertyFilter.setOperation(PropertyFilter.Operation.GREATER_OR_EQUAL);
        agePropertyFilter.setOperationEditable(true);
        agePropertyFilter.setParameterName(PropertyConditionUtils.generateParameterName(
                agePropertyFilter.getProperty()));
        agePropertyFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                dataLoader.getContainer().getEntityMetaClass(),
                agePropertyFilter.getProperty(),
                agePropertyFilter.getOperation()
        ));
    
        javaDefaultConfiguration.getRootLogicalFilterComponent().add(agePropertyFilter);
    
        // Set default values for configuration
        activePropertyFilter.setValue(false);
        javaDefaultConfiguration.setFilterComponentDefaultValue(activePropertyFilter.getParameterName(), false);
    
        gradePropertyFilter.setValue(CustomerGrade.STANDARD);
        javaDefaultConfiguration.setFilterComponentDefaultValue(gradePropertyFilter.getParameterName(), CustomerGrade.STANDARD);
    
        agePropertyFilter.setValue(30);
        javaDefaultConfiguration.setFilterComponentDefaultValue(agePropertyFilter.getParameterName(), 30);
    }
    
Add a filter component to existing configuration
    @Autowired
    protected UiComponents uiComponents;
    @Autowired
    protected SingleFilterSupport singleFilterSupport;

    @Autowired
    protected Filter filter;

    @Subscribe
    protected void onAfterInit(AfterInitEvent event) {
        DataLoader dataLoader = filter.getDataLoader();

        PropertyFilter<Integer> agePropertyFilter = uiComponents.create(PropertyFilter.NAME);
        agePropertyFilter.setConditionModificationDelegated(true);        
        agePropertyFilter.setDataLoader(dataLoader);
        agePropertyFilter.setProperty("age");
        agePropertyFilter.setOperation(PropertyFilter.Operation.GREATER_OR_EQUAL);
        agePropertyFilter.setOperationEditable(true);
        agePropertyFilter.setParameterName(PropertyConditionUtils.generateParameterName(
                agePropertyFilter.getProperty()));
        agePropertyFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                dataLoader.getContainer().getEntityMetaClass(),
                agePropertyFilter.getProperty(),
                agePropertyFilter.getOperation()
        ));

        filter.getCurrentConfiguration().getRootLogicalFilterComponent().add(agePropertyFilter);
        filter.refreshCurrentConfigurationLayout();
    }
Programmatically defined Filter
    @Autowired
    protected UiComponents uiComponents;
    @Autowired
    protected SingleFilterSupport singleFilterSupport;
    @Autowired
    protected Messages messages;

    @Autowired
    protected CollectionLoader<Customer> customersDl;

    @Subscribe
    protected void onAfterInit(AfterInitEvent event) {
        Filter filter = uiComponents.create(Filter.NAME);
        filter.setId("filter");
        getWindow().add(filter, 0);
        filter.setDataLoader(customersDl);

        filter.loadConfigurationsAndApplyDefault();

        DesignTimeConfiguration javaDefaultConfiguration = filter.addConfiguration("javaDefaultConfiguration",
                "Default configuration");

        PropertyFilter<Integer> agePropertyFilter = uiComponents.create(PropertyFilter.NAME);
        agePropertyFilter.setConditionModificationDelegated(true);
        agePropertyFilter.setDataLoader(customersDl);
        agePropertyFilter.setProperty("age");
        agePropertyFilter.setOperation(PropertyFilter.Operation.LESS_OR_EQUAL);
        agePropertyFilter.setOperationEditable(true);
        agePropertyFilter.setParameterName(PropertyConditionUtils.generateParameterName(
                agePropertyFilter.getProperty()));
        agePropertyFilter.setValueComponent(singleFilterSupport.generateValueComponent(
                customersDl.getContainer().getEntityMetaClass(),
                agePropertyFilter.getProperty(),
                agePropertyFilter.getOperation()
        ));

        javaDefaultConfiguration.getRootLogicalFilterComponent().add(agePropertyFilter);
        filter.setCurrentConfiguration(javaDefaultConfiguration);
    }
@maistrenkoIulia
Copy link

TC:
ser for browser filter with actions:

<filter dataLoader="personsDl">
    <properties include=".*"/>
    <actions>
        <action id="1" type="filter_addCondition"/>
        <action id="2" type="filter_clearValues"/>
        <action id="3" type="filter_copy"/>
        <action id="4" type="filter_edit"/>
        <action id="5" type="filter_makeDefault"/>
        <action id="6" type="filter_remove"/>
        <action id="7" type="filter_save"/>
        <action id="8" type="filter_saveAs"/>
        <action id="9" type="filter_saveWithValues"/>
    </actions>
</filter>

run app>open browser>filter_settingsButton
ER: save as, coby actions should be available
AR: all actions available

@maistrenkoIulia
Copy link

maistrenkoIulia commented Feb 10, 2021

1.captionPosition attr isn`t find by idea
image

  1. add confition in xml with operationEditable="false" / operationCaptionVisible="true"
 <conditions>
                <propertyFilter property="testName"
                                operation="EQUAL"
                                operationEditable="false"
                                operationCaptionVisible="true"
                                defaultValue="2"
                                caption="Test name condition"/>
            </conditions>
  1. select this condifion in filter screen
    ER: operator should be visible
    AR:
    image
  • Not a bug (caption attr shouldn`t be set)
  1. edit firler with several attrs > change ordering of condition> Ok
  2. ER: order of conditions should be changed in filter
  3. AR: changes hasn`t been applied

@maistrenkoIulia
Copy link

maistrenkoIulia commented Feb 11, 2021

TC: set jmix.ui.showFilterConfigurationIdField =true
run app
edit filter

  1. ER: confiuration id should be aligned left
    image

  2. set generated id = false, set custom value for confiuration id >ok
    Edit again
    ER: confiuration name/ confiuration id should have values set previously
    AR:
    image

@maistrenkoIulia
Copy link

maistrenkoIulia commented Feb 11, 2021

  1. missing confirmation popup during filter>remove
  2. Filer>edit>create property condition> ok
    edit property condition>set required = true >ok>ok
    ER: value should be applied to property condition
    AR: required =false
    image

@maistrenkoIulia
Copy link

need to localize hint for Parameter Name in 'Proprty Condition Editor'
image

@GlebDurygin
Copy link
Contributor Author

Will be fixed in #343

need to localize hint for Parameter Name in 'Proprty Condition Editor'

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants