Статьи

Данные Master-Detail с представлением списка ADF

В последнее время компонент таблицы ADF Faces больше не считается классным с точки зрения пользовательского интерфейса. Предполагается, что представление « Список» сегодня отлично подходит для отображения коллекций данных. Это не значит, что мы не должны использовать af: table вообще. В некоторых случаях (довольно часто :)) таблица гораздо более удобна, чем представление списка. Тем не менее, компонент представления списка выглядит действительно хорошо, он хорошо сочетается с современной тенденцией пользовательского интерфейса и определенно заслуживает широкого использования в приложениях ADF.

Одним из наиболее распространенных вариантов использования, связанных со сбором данных, является отображение основных данных. В этом посте я собираюсь показать, что мы можем сделать с помощью списка .

Компонент List View предоставляет готовые функциональные возможности для отображения иерархических данных с использованием фасета groupHeaderStamp .

Допустим, в приложении определена иерархия Departments-Employees:

Снимок экрана 2015-12-01 в 2.53.27 вечера

Если мы перетащим подробный набор сотрудников на страницу и выберем представление списка ADF в качестве необходимого компонента, мастер позволит нам включить заголовок группы, содержащий атрибуты из родительской коллекции:

Снимок экрана 2015-12-01 в 2.56.44 PM

В результате представление списка на странице будет содержать фасет groupHeaderStamp с атрибутами Department:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<af:listView value="#{bindings.Departments.treeModel}" var="item" ...
             fetchSize="#{bindings.Departments.rangeSize}" id="lv1">
  <af:listItem id="li1">
    <af:panelGridLayout id="pgl2">
      <af:gridRow marginTop="5px" height="auto" marginBottom="5px" id="gr1">
        <af:gridCell marginStart="5px" width="34%" id="gc1">
          <af:outputFormatted value="#{item.bindings.EmployeeId.inputValue}"
          id="of1"/>
        </af:gridCell>
        ...
    </af:panelGridLayout>
  </af:listItem>
  <f:facet name="groupHeaderStamp">
    <af:listItem id="li2">
      <af:outputFormatted value="#{item.bindings.DepartmentName.inputValue}"
          id="of6"/>
    </af:listItem>
  </f:facet>
</af:listView>

И это выглядит так:

Снимок экрана 2015-12-01 в 4.12.37 PM

Это выглядит красиво, но это не то, что мне нужно! Мое требование — реализовать что-то вроде этого:

Снимок экрана 2015-12-01 в 16.05.09

Таким образом, каждый отдел представлен панелью с двумя вкладками: общая информация об отделе и список сотрудников. Этот вариант использования может быть легко реализован с использованием Accessors из определения узла модели дерева . Древовидная модель для нашего списка в файле page def выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<tree IterBinding="DepartmentsIterator" id="Departments">
  <nodeDefinition DefName="DepartmentsDeafultVO" Name="Departments0">
    <AttrNames>
      <Item Value="DepartmentId"/>
      <Item Value="DepartmentName"/>
    </AttrNames>
    <Accessors>
      <Item Value="Employees"/>
    </Accessors>
  </nodeDefinition>
  <nodeDefinition DefName="EmployeesDeafultVO" Name="Departments1">
    <AttrNames>
      <Item Value="EmployeeId"/>
      <Item Value="FirstName"/>
      <Item Value="LastName"/>
      <Item Value="Email"/>
    </AttrNames>
  </nodeDefinition>
</tree>

Существует определитель доступа Employees, определенный в определении узла Departments0 . Он использует средство доступа к представлению « Сотрудники» для получения подробных записей для каждой строки отдела. Структура подробных записей описана в определении узла Departments1 .

Мы собираемся использовать эту модель иерархического дерева следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<af:listView value="#{bindings.Departments.treeModel}" var="item" ...>            
  <af:listItem id="li1">
   <af:panelTabbed position="above" id="pt1" childCreation="lazyUncached">
    <af:showDetailItem id="tab1" text="Department">
      <af:panelFormLayout id="pfl1" inlineStyle="height:150px;">
      <af:panelLabelAndMessage label="#{item.bindings.DepartmentId.hints.label}"
                               id="plam1">
        <af:inputText value="#{item.bindings.DepartmentId.inputValue}"id="ot1"/>
      </af:panelLabelAndMessage>
        ...
 
      </af:panelFormLayout>
    </af:showDetailItem>
    <af:showDetailItem id="sdi1" text="Employees">
     <af:listView value="#{item.Employees}" var="empItem" ...>
      <af:listItem id="li2">
        <af:panelGridLayout id="pgl2">
          <af:gridRow  id="gr1">
            <af:gridCell id="gc1">
       <af:outputFormatted value="#{empItem.bindings.EmployeeId.inputValue}"
                           id="of1"/>
            </af:gridCell>
            ...
        </af:panelGridLayout>
      </af:listItem>
     </af:listView>
    </af:showDetailItem>
    </af:panelTabbed>
  </af:listItem>
</af:listView>

Таким образом, каждый элемент списка содержит панель с вкладками внутри, а вкладка «Сотрудники» содержит вложенный список (фактически это может быть что угодно, например, таблицу) со ссылкой на средство доступа « Сотрудники» .

  • Пример приложения для этого поста доступен здесь .

Требуется JDeveloper 12.1.3.

Это оно!

Ссылка: Данные Master-Detail с ADF List View от нашего партнера JCG Евгения Федоренко в блоге ADF Practice .