Skip to content

Commit 07afe0f

Browse files
committed
WIP - Tabs lazy loading, search wrapper styling
1 parent 2381820 commit 07afe0f

File tree

5 files changed

+106
-68
lines changed

5 files changed

+106
-68
lines changed

roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/tabs/AIPDescriptiveMetadataTabs.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.roda.wui.client.browse.tabs;
22

3+
import com.google.gwt.user.client.ui.Widget;
34
import org.roda.core.data.common.RodaConstants;
45
import org.roda.core.data.v2.ip.AIPState;
56
import org.roda.core.data.v2.ip.IndexedAIP;
@@ -142,7 +143,13 @@ public void onError(Request request, Throwable e) {
142143
}
143144
cardBody.add(metadataHTML);
144145
// Create and add tab
145-
createAndAddTab(buttonTitle, content);
146+
// This descriptive metadata content is NOT lazy loading!
147+
createAndAddTab(buttonTitle, new TabContentBuilder() {
148+
@Override
149+
public Widget buildTabWidget() {
150+
return content;
151+
}
152+
});
146153
}
147154
// Create button
148155
Button createButton = new Button(messages.newButton());

roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/tabs/BrowseAIPTabs.java

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.roda.wui.client.disposal.association.DisposalPolicyAssociationTab;
2828

2929
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
30+
import com.google.gwt.user.client.ui.Widget;
3031

3132
/**
3233
*
@@ -36,52 +37,75 @@ public class BrowseAIPTabs extends Tabs {
3637
public void init(IndexedAIP aip, BrowseAIPResponse browseAIPResponse,
3738
DescriptiveMetadataInfos descriptiveMetadataInfos) {
3839
boolean justActive = AIPState.ACTIVE.equals(aip.getState());
39-
40-
// TODO: These tabs should be lazy loading
41-
4240
// Descriptive metadata
43-
AIPDescriptiveMetadataTabs aipDescriptiveMetadataTabs = new AIPDescriptiveMetadataTabs();
44-
aipDescriptiveMetadataTabs.init(aip, descriptiveMetadataInfos);
45-
aipDescriptiveMetadataTabs.setStyleName("descriptiveMetadataTabs");
46-
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.descriptiveMetadataTab()), aipDescriptiveMetadataTabs);
41+
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.descriptiveMetadataTab()), new TabContentBuilder() {
42+
@Override
43+
public Widget buildTabWidget() {
44+
AIPDescriptiveMetadataTabs aipDescriptiveMetadataTabs = new AIPDescriptiveMetadataTabs();
45+
aipDescriptiveMetadataTabs.init(aip, descriptiveMetadataInfos);
46+
aipDescriptiveMetadataTabs.setStyleName("descriptiveMetadataTabs");
47+
return aipDescriptiveMetadataTabs;
48+
}
49+
});
4750

4851
// Preservation events
49-
Filter eventFilter = new Filter(new AllFilterParameter());
50-
eventFilter.add(new SimpleFilterParameter(RodaConstants.PRESERVATION_EVENT_AIP_ID, aip.getId()));
51-
SearchWrapper preservationEvents = new SearchWrapper(false)
52-
.createListAndSearchPanel(new ListBuilder<>(() -> new PreservationEventList(),
53-
new AsyncTableCellOptions<>(IndexedPreservationEvent.class, "BrowseAIP_preservationEvents")
54-
.withFilter(eventFilter).withSummary(messages.searchResults()).bindOpener()
55-
.withActionable(PreservationEventActions.get(aip.getId(), null, null))));
56-
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.preservationEventsTab()), preservationEvents);
52+
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.preservationEventsTab()), new TabContentBuilder() {
53+
@Override
54+
public Widget buildTabWidget() {
55+
Filter eventFilter = new Filter(new AllFilterParameter());
56+
eventFilter.add(new SimpleFilterParameter(RodaConstants.PRESERVATION_EVENT_AIP_ID, aip.getId()));
57+
return new SearchWrapper(false)
58+
.createListAndSearchPanel(new ListBuilder<>(() -> new PreservationEventList(),
59+
new AsyncTableCellOptions<>(IndexedPreservationEvent.class, "BrowseAIP_preservationEvents")
60+
.withFilter(eventFilter).withSummary(messages.searchResults()).bindOpener()
61+
.withActionable(PreservationEventActions.get(aip.getId(), null, null))));
62+
}
63+
});
5764

5865
// Logs
59-
SearchWrapper auditLogs = new SearchWrapper(false);
60-
auditLogs.createListAndSearchPanel(new ListBuilder<>(() -> new LogEntryList(),
61-
new AsyncTableCellOptions<>(LogEntry.class, "BrowseAIP_auditLogs")
62-
.withFilter(new Filter(new SimpleFilterParameter(RodaConstants.LOG_RELATED_OBJECT_ID, aip.getId())))
63-
.withJustActive(justActive).bindOpener()));
64-
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.auditLogsTab()), auditLogs);
66+
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.auditLogsTab()), new TabContentBuilder() {
67+
@Override
68+
public Widget buildTabWidget() {
69+
SearchWrapper auditLogs = new SearchWrapper(false);
70+
auditLogs.createListAndSearchPanel(new ListBuilder<>(() -> new LogEntryList(),
71+
new AsyncTableCellOptions<>(LogEntry.class, "BrowseAIP_auditLogs")
72+
.withFilter(new Filter(new SimpleFilterParameter(RodaConstants.LOG_RELATED_OBJECT_ID, aip.getId())))
73+
.withJustActive(justActive).bindOpener()));
74+
return auditLogs;
75+
}
76+
});
6577

6678
// Risk incidences
67-
SearchWrapper riskIncidences = new SearchWrapper(false);
68-
riskIncidences.createListAndSearchPanel(new ListBuilder<>(() -> new RiskIncidenceList(),
69-
new AsyncTableCellOptions<>(RiskIncidence.class, "BrowseAIP_riskIncidences")
70-
.withFilter(new Filter(new SimpleFilterParameter(RodaConstants.RISK_INCIDENCE_AIP_ID, aip.getId())))
71-
.withJustActive(justActive).bindOpener()));
72-
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.risksTab()), riskIncidences);
79+
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.risksTab()), new TabContentBuilder() {
80+
@Override
81+
public Widget buildTabWidget() {
82+
SearchWrapper riskIncidences = new SearchWrapper(false);
83+
riskIncidences.createListAndSearchPanel(new ListBuilder<>(() -> new RiskIncidenceList(),
84+
new AsyncTableCellOptions<>(RiskIncidence.class, "BrowseAIP_riskIncidences")
85+
.withFilter(new Filter(new SimpleFilterParameter(RodaConstants.RISK_INCIDENCE_AIP_ID, aip.getId())))
86+
.withJustActive(justActive).bindOpener()));
87+
return riskIncidences;
88+
}
89+
});
7390

7491
// Disposal
75-
DisposalPolicyAssociationTab disposalPolicyAssociationPanel = new DisposalPolicyAssociationTab(browseAIPResponse);
76-
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.disposalTab()), disposalPolicyAssociationPanel);
92+
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.disposalTab()), new TabContentBuilder() {
93+
@Override
94+
public Widget buildTabWidget() {
95+
return new DisposalPolicyAssociationTab(browseAIPResponse);
96+
}
97+
});
7798

7899
// Permissions
79-
AIPToolbarActions aipToolbarActions = AIPToolbarActions.get(aip.getId(), aip.getState(), aip.getPermissions());
80-
EditPermissionsTab permissionsTab = new EditPermissionsTab(new ActionableWidgetBuilder<>(aipToolbarActions)
81-
.buildGroupedListWithObjects(new ActionableObject<>(aip), List.of(AIPToolbarActions.AIPAction.UPDATE_PERMISSIONS),
82-
List.of(AIPToolbarActions.AIPAction.UPDATE_PERMISSIONS)),
83-
IndexedAIP.class.getName(), aip);
84-
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.permissionsTab()), permissionsTab);
100+
createAndAddTab(SafeHtmlUtils.fromSafeConstant(messages.permissionsTab()), new TabContentBuilder() {
101+
@Override
102+
public Widget buildTabWidget() {
103+
AIPToolbarActions aipToolbarActions = AIPToolbarActions.get(aip.getId(), aip.getState(), aip.getPermissions());
104+
return new EditPermissionsTab(new ActionableWidgetBuilder<>(aipToolbarActions).buildGroupedListWithObjects(
105+
new ActionableObject<>(aip), List.of(AIPToolbarActions.AIPAction.UPDATE_PERMISSIONS),
106+
List.of(AIPToolbarActions.AIPAction.UPDATE_PERMISSIONS)), IndexedAIP.class.getName(), aip);
107+
}
108+
});
85109

86110
}
87111
}

roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/tabs/Tabs.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class Tabs extends Composite {
3232
SimplePanel tabContentWrapper;
3333

3434
private Widget selectedTab;
35-
private final Map<Widget, Widget> tabs;
35+
private final Map<Widget, TabContentBuilder> tabs;
3636

3737
public Tabs() {
3838
initWidget(uiBinder.createAndBindUi(this));
@@ -41,28 +41,28 @@ public Tabs() {
4141
selectedTab = null;
4242
}
4343

44-
public void createAndAddTab(Widget tabButtonInnerWidget, Widget tabContent) {
44+
public void createAndAddTab(Widget tabButtonInnerWidget, TabContentBuilder tabContentBuilder) {
4545
SimplePanel tabButtonContainer = new SimplePanel();
4646
tabButtonContainer.addStyleName("tabButtonContainer");
4747
FocusPanel tabButton = new FocusPanel(tabButtonInnerWidget);
4848
tabButton.addStyleName("tabButton");
4949
tabButtonContainer.setWidget(tabButton);
5050
tabButtons.add(tabButtonContainer);
51-
tabs.put(tabButtonContainer, tabContent);
51+
tabs.put(tabButtonContainer, tabContentBuilder);
5252
tabButton.addClickHandler(createTabClickHandler(tabButtonContainer));
5353
if (selectedTab == null) {
5454
selectTab(tabButtonContainer);
5555
}
5656
}
5757

58-
public void createAndAddTab(SafeHtml tabTitle, Widget tabContent) {
58+
public void createAndAddTab(SafeHtml tabTitle, TabContentBuilder tabContentBuilder) {
5959
SimplePanel tabButtonContainer = new SimplePanel();
6060
tabButtonContainer.addStyleName("tabButtonContainer");
6161
Button tabButton = new Button(tabTitle);
6262
tabButton.addStyleName("tabButton");
6363
tabButtonContainer.setWidget(tabButton);
6464
tabButtons.add(tabButtonContainer);
65-
tabs.put(tabButtonContainer, tabContent);
65+
tabs.put(tabButtonContainer, tabContentBuilder);
6666
tabButton.addClickHandler(createTabClickHandler(tabButtonContainer));
6767
if (selectedTab == null) {
6868
selectTab(tabButtonContainer);
@@ -86,17 +86,21 @@ public void onClick(ClickEvent event) {
8686
}
8787

8888
private void selectTab(Widget tabButtonContainer) {
89-
for (Map.Entry<Widget, Widget> tab : tabs.entrySet()) {
89+
for (Map.Entry<Widget, TabContentBuilder> tab : tabs.entrySet()) {
9090
if (tab.getKey().equals(tabButtonContainer)) {
9191
selectedTab = tabButtonContainer;
9292
tab.getKey().addStyleName("tabSelected");
93-
tabContentWrapper.setWidget(tab.getValue());
93+
tabContentWrapper.setWidget(tab.getValue().buildTabWidget());
9494
} else {
9595
tab.getKey().removeStyleName("tabSelected");
9696
}
9797
}
9898
}
9999

100+
public interface TabContentBuilder {
101+
public Widget buildTabWidget();
102+
}
103+
100104
interface MyUiBinder extends UiBinder<Widget, Tabs> {
101105
}
102106
}

roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/resources/main.gss

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,6 +2453,18 @@ td.datePickerMonth, td.datePickerYear {
24532453
height: auto
24542454
}
24552455

2456+
.bannerHeader table tr {
2457+
line-height: normal;
2458+
}
2459+
2460+
.bannerHeader table tr .gwt-MenuItem.navigationMenu-item {
2461+
padding: 6px;
2462+
}
2463+
2464+
.bannerHeader table tr .gwt-MenuItem.navigationMenu-item .largeIcon {
2465+
font-size: 30px;
2466+
}
2467+
24562468
.bannerHeader .gwt-MenuItem {
24572469
font-size: 12px !important;
24582470
font-weight: 500;
@@ -4238,7 +4250,6 @@ td.datePickerMonth, td.datePickerYear {
42384250

42394251
.searchWrapperMainPanel {
42404252
background-color: white;
4241-
padding: 16px;
42424253
border-radius: 8px;
42434254
box-shadow: 0px 2px 4px 0px COLOR_SHADOW;
42444255
flex: 1;
@@ -4249,10 +4260,10 @@ td.datePickerMonth, td.datePickerYear {
42494260
}
42504261

42514262
.searchWrapper .objectToolbar {
4252-
background-color: white;
42534263
gap: 0;
42544264
min-height: 32px;
42554265
margin-top: 16px;
4266+
padding: 8px 16px;
42564267
}
42574268

42584269
.searchWrapper .objectToolbar .groupedActionableEmptyHelp {
@@ -4287,6 +4298,7 @@ td.datePickerMonth, td.datePickerYear {
42874298
display: flex;
42884299
gap: 16px;
42894300
align-items: center;
4301+
padding: 16px 16px 0 16px;
42904302
}
42914303

42924304
.searchPanelLeft {
@@ -4585,7 +4597,7 @@ td.datePickerMonth, td.datePickerYear {
45854597
}
45864598

45874599
.searchAdvancedPanel {
4588-
padding: 20px 0 !important;
4600+
padding: 20px 16px !important;
45894601
min-height: auto;
45904602
}
45914603

@@ -4775,6 +4787,7 @@ td.datePickerMonth, td.datePickerYear {
47754787
}
47764788

47774789
.searchPreFilters {
4790+
padding: 0 16px 16px 16px;
47784791
font-size: 60%;
47794792
}
47804793

@@ -8501,10 +8514,6 @@ span.code {
85018514
flex: 1;
85028515
}
85038516

8504-
.descriptiveMetadataTabs .objectToolbar {
8505-
background-color: transparent;
8506-
}
8507-
85088517
.descriptiveMetadataTabs .tabsHeader {
85098518
border: none;
85108519
}
@@ -8578,23 +8587,17 @@ span.code {
85788587
background-color: white;
85798588
border-radius: 8px;
85808589
box-shadow: 0px 2px 4px 0px COLOR_SHADOW;
8581-
padding: 16px !important;
85828590
display: flex;
85838591
flex-direction: column;
85848592
gap: 8px;
85858593
}
85868594

8587-
.disposalAssociationTab .objectToolbar {
8588-
background-color: transparent;
8589-
}
8590-
85918595
.disposalAssociationTab .row {
85928596
margin: 0px;
85938597
}
85948598

85958599
.disposalAssociationTab .row .content {
85968600
margin: 0px;
8597-
padding: 24px 32px !important;
85988601
min-height: initial;
85998602
}
86008603

@@ -8655,10 +8658,6 @@ span.code {
86558658
Permissions Tab
86568659
******************************/
86578660

8658-
.permissionsTab .objectToolbar {
8659-
background-color: transparent;
8660-
}
8661-
86628661
.permissionsTab .row {
86638662
margin: 0;
86648663
padding: 0;

roda-ui/roda-wui/src/main/java/org/roda/wui/client/disposal/association/DisposalPolicyAssociationTab.ui.xml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55
xmlns:association="urn:import:org.roda.wui.client.disposal.association">
66

77
<ui:with field='messages' type='config.i18n.client.ClientMessages' />
8-
<g:FlowPanel styleName="disposalAssociationTab" addStyleNames="wrapper skip_padding">
9-
<common:ActionsToolbar ui:field="actionsToolbar" />
10-
<g:FlowPanel addStyleNames="row full_width skip_padding">
11-
<g:FlowPanel addStyleNames="col_10 content">
12-
<common:DisposalPolicySummaryPanel ui:field="disposalPolicySummaryPanel" />
13-
<association:DisposalConfirmationPanel ui:field="disposalConfirmationPanel" />
14-
<association:RetentionPeriodPanel ui:field="retentionPeriodPanel" />
15-
<association:DisposalHoldsPanel ui:field="disposalHoldsPanel" />
8+
<g:FlowPanel styleName="disposalAssociationTab roda6CardWithHeader" addStyleNames="wrapper skip_padding">
9+
<g:FlowPanel addStyleNames="cardHeader">
10+
<common:ActionsToolbar ui:field="actionsToolbar" />
11+
</g:FlowPanel>
12+
<g:FlowPanel addStyleNames="cardBody">
13+
<g:FlowPanel addStyleNames="row full_width skip_padding">
14+
<g:FlowPanel addStyleNames="col_10 content">
15+
<common:DisposalPolicySummaryPanel ui:field="disposalPolicySummaryPanel" />
16+
<association:DisposalConfirmationPanel ui:field="disposalConfirmationPanel" />
17+
<association:RetentionPeriodPanel ui:field="retentionPeriodPanel" />
18+
<association:DisposalHoldsPanel ui:field="disposalHoldsPanel" />
19+
</g:FlowPanel>
1620
</g:FlowPanel>
1721
</g:FlowPanel>
1822
</g:FlowPanel>

0 commit comments

Comments
 (0)