Skip to content

Commit 42a9fa3

Browse files
committed
WIP - Search panel sidebar buttons, welcome page reordering
1 parent 1f21175 commit 42a9fa3

File tree

10 files changed

+247
-133
lines changed

10 files changed

+247
-133
lines changed

roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/actions/widgets/ActionableWidgetBuilder.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,26 @@ public Widget buildListWithObjects(ActionableObject<T> objects, List<Actionable.
112112
return createActionsMenu(actionableBundle, objects);
113113
}
114114

115+
public Widget buildListWithObjectsAndDefaults(ActionableObject<T> objects) {
116+
ActionableBundle<T> actionableBundle = actionable.createActionsBundle();
117+
return createActionsMenuWithDefaults(actionableBundle, objects);
118+
}
119+
120+
public Widget buildListWithObjectsAndDefaults(ActionableObject<T> objects,
121+
List<Actionable.Action<T>> actionWhitelist) {
122+
ActionableBundle<T> actionableBundle = actionable.createActionsBundle();
123+
124+
if (!actionWhitelist.isEmpty()) {
125+
// remove unwanted buttons, and the whole group if it is empty
126+
actionableBundle.getGroups().removeIf(group -> {
127+
group.getButtons().removeIf(button -> !actionWhitelist.contains(button.getAction()));
128+
return group.getButtons().isEmpty();
129+
});
130+
}
131+
132+
return createActionsMenuWithDefaults(actionableBundle, objects);
133+
}
134+
115135
public Widget buildGroupedListWithObjects(ActionableObject<T> objects) {
116136
ActionableBundle<T> actionableBundle = actionable.createActionsBundle();
117137
return createGroupedActionsMenu(actionableBundle, objects, List.of());
@@ -213,6 +233,77 @@ public void onSuccess(Actionable.ActionImpact result) {
213233
return panel;
214234
}
215235

236+
private FlowPanel createActionsMenuWithDefaults(ActionableBundle<T> actionableBundle, ActionableObject<T> objects) {
237+
FlowPanel panel = new FlowPanel();
238+
panel.addStyleName("actionable-menu");
239+
240+
boolean isReadonly = NodeType.valueOf(ConfigurationManager.getString(RodaConstants.RODA_NODE_TYPE_KEY))
241+
.equals(NodeType.REPLICA);
242+
int addedButtonCount = 0;
243+
244+
for (ActionableGroup<T> actionGroup : actionableBundle.getGroups()) {
245+
boolean hasButtonsOnThisGroup = false;
246+
ActionableTitle actionableTitle = actionGroup.getTitle();
247+
Label groupTitle = new Label(actionableTitle.getTitle());
248+
groupTitle.addStyleName("h4 actionable-title");
249+
if (!actionableTitle.hasTitle()) {
250+
groupTitle.addStyleName("actionable-title-empty");
251+
}
252+
panel.add(groupTitle);
253+
254+
for (ActionableButton<T> actionButton : actionGroup.getButtons()) {
255+
ActionButton<T> button = new ActionButton<>(actionButton);
256+
panel.add(button);
257+
addedButtonCount++;
258+
if ((!isReadonly || actionButton.getImpact().equals(ActionImpact.NONE))
259+
&& actionable.canAct(actionButton.getAction(), objects)) {
260+
button.addClickHandler(new ClickHandler() {
261+
@Override
262+
public void onClick(ClickEvent event) {
263+
button.setEnabled(false);
264+
actionable.act(actionButton.getAction(), objects, new AsyncCallback<Actionable.ActionImpact>() {
265+
@Override
266+
public void onFailure(Throwable caught) {
267+
actionImpactCallback.onFailure(caught);
268+
button.setEnabled(true);
269+
}
270+
271+
@Override
272+
public void onSuccess(Actionable.ActionImpact result) {
273+
actionImpactCallback.onSuccess(result);
274+
button.setEnabled(true);
275+
}
276+
});
277+
}
278+
});
279+
}
280+
else {
281+
button.setEnabled(false);
282+
}
283+
}
284+
285+
}
286+
287+
if (includeBackButton) {
288+
ActionButton<T> backButton = new ActionButton<>(
289+
new ActionableButton<>(messages.backButton(), null, ActionImpact.NONE, "fas fa-arrow-circle-left"));
290+
backButton.addClickHandler(event -> History.back());
291+
backButton.addStyleName("actionable-button-back");
292+
panel.add(backButton);
293+
addedButtonCount++;
294+
}
295+
296+
if (addedButtonCount == 0) {
297+
Label emptyHelpText = new Label(messages.actionableEmptyHelp(objects.getType()));
298+
emptyHelpText.addStyleName("actions-empty-help");
299+
panel.add(emptyHelpText);
300+
}
301+
302+
widgetCreatedHandler.accept(addedButtonCount);
303+
304+
return panel;
305+
}
306+
216307
private FlowPanel createGroupedActionsMenu(ActionableBundle<T> actionableBundle, ActionableObject<T> objects,
217308
List<Actionable.Action<T>> ungroupedActions) {
218309
FlowPanel panel = new FlowPanel();

roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/labels/LabelWithIcon.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,12 @@ public void setText(String text) {
4343

4444
public void setIcon(String iconClasses) {
4545
if (iconClasses != null && !iconClasses.isEmpty()) {
46+
icon.setVisible(true);
4647
icon.setHTML(SafeHtmlUtils.fromSafeConstant("<i class=\"" + iconClasses + "\"></i>"));
4748
}
49+
else {
50+
icon.setVisible(false);
51+
}
4852
}
4953

5054
interface MyUiBinder extends UiBinder<Widget, LabelWithIcon> {

roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/lists/utils/AsyncTableCell.java

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.roda.core.data.v2.jobs.IndexedReport;
4040
import org.roda.core.data.v2.log.LogEntry;
4141
import org.roda.core.data.v2.notifications.Notification;
42+
import org.roda.wui.client.common.ActionsToolbar;
4243
import org.roda.wui.client.common.NoAsyncCallback;
4344
import org.roda.wui.client.common.actions.Actionable;
4445
import org.roda.wui.client.common.actions.model.ActionableObject;
@@ -126,6 +127,7 @@ public abstract class AsyncTableCell<T extends IsIndexed> extends FlowPanel
126127
private Actionable<T> actionable;
127128
private FlowPanel mainPanel;
128129
private FlowPanel sidePanel;
130+
private FlowPanel facetsPanel;
129131
private MyAsyncDataProvider<T> dataProvider;
130132
private SingleSelectionModel<T> selectionModel;
131133
private AccessibleSimplePager resultsPager;
@@ -250,6 +252,55 @@ protected void fireChangeEvent(IndexResult<T> result) {
250252
csvDownloadButton.addStyleName("btn btn-link btn-download csvDownloadButton");
251253
csvDownloadButton.setVisible(options.isCsvDownloadButtonVisibility());
252254

255+
ActionsToolbar toolbar = new ActionsToolbar();
256+
if (options.getActionable() != null && options.getActionable().hasAnyRoles() && isSelectable()) {
257+
ActionableWidgetBuilder<T> builder = new ActionableWidgetBuilder<>(options.getActionable());
258+
toolbar.setLabel(messages.actions());
259+
toolbar.setIcon(null);
260+
toolbar.setTagsVisible(false);
261+
toolbar.setActionableMenu(builder.buildListWithObjectsAndDefaults(getActionableObject()));
262+
addCheckboxSelectionListener(new CheckboxSelectionListener<T>() {
263+
@Override
264+
public void onSelectionChange(SelectedItems<T> selected) {
265+
builder.withActionCallback(new NoAsyncCallback<Actionable.ActionImpact>() {
266+
@Override
267+
public void onSuccess(Actionable.ActionImpact impact) {
268+
if (!Actionable.ActionImpact.NONE.equals(impact)) {
269+
Timer timer = new Timer() {
270+
@Override
271+
public void run() {
272+
refresh();
273+
}
274+
};
275+
timer.schedule(RodaConstants.ACTION_TIMEOUT / 2);
276+
}
277+
if (actionableCallback != null) {
278+
actionableCallback.onSuccess(impact);
279+
}
280+
}
281+
282+
@Override
283+
public void onFailure(Throwable caught) {
284+
Timer timer = new Timer() {
285+
@Override
286+
public void run() {
287+
refresh();
288+
}
289+
};
290+
timer.schedule(RodaConstants.ACTION_TIMEOUT / 2);
291+
super.onFailure(caught);
292+
if (actionableCallback != null) {
293+
actionableCallback.onFailure(caught);
294+
}
295+
}
296+
});
297+
toolbar.setActionableMenu(builder.buildListWithObjectsAndDefaults(getActionableObject()));
298+
}
299+
});
300+
} else {
301+
toolbar.setVisible(false);
302+
}
303+
253304
sidePanel = new FlowPanel();
254305
sidePanel.addStyleName("my-asyncdatagrid-side-panel");
255306
add(sidePanel);
@@ -261,17 +312,27 @@ protected void fireChangeEvent(IndexResult<T> result) {
261312
autoUpdatePanel = new AccessibleFocusPanel();
262313
autoUpdatePanel.add(autoUpdateSignal);
263314

315+
facetsPanel = new FlowPanel();
316+
facetsPanel.addStyleName("my-asyncdatagrid-facets-panel");
317+
318+
FlowPanel footer = new FlowPanel();
319+
footer.addStyleName("my-asyncdatagrid-footer");
320+
264321
mainPanel.add(display);
265-
mainPanel.add(resultsPager);
266-
mainPanel.add(pageSizePager);
267-
mainPanel.add(autoUpdatePanel);
268-
mainPanel.add(csvDownloadButton);
322+
mainPanel.add(footer);
323+
footer.add(csvDownloadButton);
324+
footer.add(pageSizePager);
325+
footer.add(resultsPager);
326+
footer.add(autoUpdatePanel);
327+
328+
sidePanel.add(toolbar);
329+
sidePanel.add(facetsPanel);
269330

270331
SimplePanel clearfix = new SimplePanel();
271332
clearfix.addStyleName("clearfix");
272333
add(clearfix);
273334

274-
toggleSidePanel(createAndBindFacets(sidePanel));
335+
toggleFacetsPanel(createAndBindFacets(facetsPanel));
275336

276337
csvDownloadButton.addClickHandler(event -> {
277338
Services services = new Services("Retrieve export limit", "get");
@@ -361,13 +422,13 @@ public AsyncTableCellOptions<T> getOptions() {
361422
return options;
362423
}
363424

364-
private void toggleSidePanel(boolean toggle) {
425+
private void toggleFacetsPanel(boolean toggle) {
365426
if (toggle) {
366427
mainPanel.removeStyleName("my-asyncdatagrid-main-panel-full");
367-
sidePanel.removeStyleName("my-asyncdatagrid-side-panel-hidden");
428+
facetsPanel.removeStyleName("my-asyncdatagrid-side-panel-hidden");
368429
} else {
369430
mainPanel.addStyleName("my-asyncdatagrid-main-panel-full");
370-
sidePanel.addStyleName("my-asyncdatagrid-side-panel-hidden");
431+
facetsPanel.addStyleName("my-asyncdatagrid-side-panel-hidden");
371432
}
372433
}
373434

@@ -725,13 +786,13 @@ public Facets getFacets() {
725786
public void setFacets(Facets facets) {
726787
this.facets = facets;
727788
refresh();
728-
toggleSidePanel(createAndBindFacets(sidePanel));
789+
toggleFacetsPanel(createAndBindFacets(facetsPanel));
729790
}
730791

731792
public void set(Filter filter, boolean justActive, Facets facets) {
732793
this.facets = facets;
733794
set(filter, justActive);
734-
toggleSidePanel(createAndBindFacets(sidePanel));
795+
toggleFacetsPanel(createAndBindFacets(facetsPanel));
735796
}
736797

737798
public void set(Filter filter, boolean justActive) {

0 commit comments

Comments
 (0)