Коллеги!
В проекте используем dataGrid:
dataContainer="detachmentDynamicsSliceDc"
settingsEnabled="false"
width="100%" height="100%">
<columns>
<column id="countryNames" caption="msg://countryNames" property="countryNames" width="120px"/>
<column id="headName" caption="msg://headName" property="headName" width="150px"/>
<column id="depNames" caption="msg://depNames" property="depNames" width="150px"/>
<column id="totalMembersCount" caption="msg://totalMembersCount" property="totalMembersCount" width="150px"/>
</columns>
</dataGrid>
для грида устанавливаем область детализации данных строки:
@Install(to = "dynamicsDetailsDataGrid", subject = "detailsGenerator")
protected Component dynamicsDetailsDataGridDetailsGenerator(KeyValueEntity item) {
VBoxLayout mainLayout = uiComponents.create(VBoxLayout.class);
mainLayout.setWidth("100%");
mainLayout.setMargin(false, false, true, true);
Component content = getDetachmentContent(item);
content.setWidth("100%");
content.setStyleName(THIN_FONT_NAME);
mainLayout.add(content);
mainLayout.expand(content);
return mainLayout;
}
сборка детализации для одной строки грида:
// собрать область DETAILS: содержание
private Component getDetachmentContent(KeyValueEntity item) {
Label<String> content = uiComponents.create(Label.TYPE_STRING);
content.setHtmlEnabled(true);
StringBuilder sb = new StringBuilder();
SimpleDateFormat sdfr = new SimpleDateFormat("dd MMMM yyyy", myDateFormatSymbols);
// Отображаемые данные
int totalMembersCount = item.getValue("totalMembersCount");
String headName = item.getValue("headName");
String taskNumber = item.getValue("taskNumber");
String taskContents = item.getValue("taskContents");
String taskPartner = item.getValue("taskPartner");
String countryNames = item.getValue("countryNames");
String depNames = item.getValue("depNames");
String d1 = sdfr.format(item.getValue("startDate"));
String d2 = sdfr.format(item.getValue("endDate"));
String taskD = sdfr.format(item.getValue("taskDate"));
// формирование HTML для отображения области DETAILS
sb.append("<div>");
// сроки
sb.append("Командировка ");
// подразделения
if (depNames.isEmpty() == false) {
sb.append(" ");
sb.append(depNames);
}
sb.append(" с ");
sb.append(d1);
sb.append(" по ");
sb.append(d2);
// содержание
if (taskContents != "") {
sb.append(", для ");
sb.append(taskContents);
sb.append(".");
}
// принимающая сторона
if (taskPartner.isEmpty() == false) {
sb.append("<br>");
sb.append("Принимающая сторона: ");
sb.append(taskPartner);
if (countryNames.isEmpty() == false) {
sb.append(" (");
sb.append(countryNames);
sb.append(").");
}
}
// глава делегации
sb.append("<br>");
sb.append("Глава делегации: ");
sb.append(headName);
// кол-во командируемых работников
if (totalMembersCount > 0) {
sb.append(" ( всего: ");
sb.append(totalMembersCount);
sb.append(" работников");
sb.append(")");
}
// номер и дата задания на командирование
if (!taskNumber.isEmpty()) {
sb.append(", задание на командирование № ");
sb.append(taskNumber);
sb.append(" от ");
sb.append(taskD);
sb.append(" г.");
}
sb.append(" </div>");
content.setValue(sb.toString());
return content;
}
Как только мы добавляем автоматическое раскрытие области детализации для всех строк грида, начинается страшное торможение (десятки секунд):
// показать область детализации для всех строк DataGrid
private static void ExpandAllDetails(DataGrid dataGrid) {
DataGridItems dataGridItems = dataGrid.getItems();
dataGridItems.getItems()
.filter(o -> o != null)
.forEach(o -> dataGrid.setDetailsVisible((Entity) o, true));
}
Причем время торможения напрямую зависит от количества строк в гриде.
Трасса системного времени по коду показала, что сами по себе методы и запросы отрабатывают почти мгновенно.
В чем проблема не понятно, но есть версия, что это связано со скриптом и рендерингом…
На гриде с количеством строк более 200 получили сокет таймаут…
Помогите, пожалуйста, разобраться.
Спасибо!