Сортировка в таблице

Добрый день.

Платформа 7.2
Вроде вопрос казался мне тривиальным, но тем не менее никак его решить не могу.

...
    <data>
        <instance id="costPlanDc" class="com.borets.npd.entity.CostPlan" view="costPlan-edit-view">
            <loader/>
            <instance id="projectDc" property="project">
                <collection id="stagesDc" property="stages"/>
            </instance>
        </instance>
    </data>
...
            <table height="AUTO" width="600px" dataContainer="stagesDc" editable="true" sortable="true">
                <columns>
                    <column id="baseStage.number" sort="ASCENDING"/>
                    <column id="baseStage.title"/>
                    <column id="laborCost" editable="true"/>
                </columns>
            </table>

Вот эту таблицу я бы хотел отсортировать по атрибуту baseStage.number.
Для начала: это не работает в том виде, в котором приведено для примера. Т.е. сортировка в интерфейсе отображается включенной, но данные не отсортированы:
image
Если пощелкать по сортировке, то она рабочая в принципе…
image

Но это я с конца начал. А если сначала, то не понятно как определить эту сортировку при загрузке данных?
Хотел сделать это в классе связанной сущности @OrderBy("baseStage.number ASC"), но столкнулся с https://github.com/cuba-platform/cuba/issues/2706

В итоге единственный выход это денормализация? Или я чего-то упускаю?

Добрый день, @sergeevms!

Атрибут sort, который указывается в XML для колонки таблицы, используется как значение по умолчанию для напраления сортировки. Если пользовательские настройки включены (атрибут settingsEnabled), то значение направления сортировки берется из них и переопределяет значение атрибута sort.
Если вы хотите, чтобы направление сортировки задавалось только в XML, то попробуйте установить атрибут settingsEnabledв значение false для вашей таблицы.

С уважением,
Глеб

В том-то и дело, что не работает никак…
Обратите внимание, что сортируемая колонка baseStage.number и находится она во вложенном контейнере.

@sergeevms у меня не получилось воспроизвести вашу проблему на платформе версии 7.2. Даже с вложенным контейнером сортировка работает так, как я описал выше. Пришлите, пожалуйста, тестовый проект, где бы воспроизводилась ваша проблема, чтобы я смог разобраться.

С уважением,
Глеб

Добрый день, @sergeevms

У меня получилось воспроизвести вашу проблему. Попробуйте перенести вызов сортировки из XML в метод onAfterShow(AfterShowEvent event):

@Subscribe
protected void onAfterShow(AfterShowEvent event) {
    stagesTable.sort("baseStage.number", Table.SortDirection.ASCENDING);
}

С уважением,
Глеб

1 симпатия

Спасибо. Так сортировка применилась.

Напишу тут же:
похоже, что для KeyValueCollectionContainer и DataGrid сортировка вообще не работает.

Здравствуйте,
Не могли бы Вы описать проблему более подробно?

Как вы делаете сортировку? Указывая sort колонке DataGrid?
Как и в какой момент загружаются данные для KeyValueCollectionContainer? Стоит аннотация “@LoadDataBeforeShow”?
На экране нет других компонентов использующих тот же KeyValueCollectionContainer?

Можете привести код контроллера и дескриптора экрана где не работает сортировка?

Вот тут я выкладывал тестовый проект.
Там при создании сущности создается 2 сущности в детальном разделе. Можно означить поле name (можно присвоить значение программно) и попытаться посортировать. Событие там InitEntityEvent

Здравствуйте.
Спасибо за Ваш сэмл-проект. Мы нашли в чем проблема и создали тикет: https://github.com/cuba-platform/cuba/issues/2783
Дело не в DataGrid, а в том что у kvsDc не задан data loder.

Если изменить data - компонент добавив <loader/> сортировка начинает работать. Тем не менее это - баг и мы его исправим в одной из следующих версий платформы.

<keyValueCollection id="kvsDc">
            <properties>
                <property name="name" datatype="string"/>
            </properties>
            <loader/>
        </keyValueCollection>
2 симпатии