From 1a0259383e67903a1be253e40d89df4c9b2b4450 Mon Sep 17 00:00:00 2001 From: Alexandre Flores Date: Fri, 17 Jan 2025 09:47:48 +0000 Subject: [PATCH] Changed AsyncTableCell's select all functionality --- .../common/dialogs/DatabaseSelectDialog.java | 1 + .../common/lists/utils/AsyncTableCell.java | 180 ++++++++---------- 2 files changed, 79 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/databasepreservation/common/client/common/dialogs/DatabaseSelectDialog.java b/src/main/java/com/databasepreservation/common/client/common/dialogs/DatabaseSelectDialog.java index fe3df598..7903196d 100644 --- a/src/main/java/com/databasepreservation/common/client/common/dialogs/DatabaseSelectDialog.java +++ b/src/main/java/com/databasepreservation/common/client/common/dialogs/DatabaseSelectDialog.java @@ -197,6 +197,7 @@ private void cancelHandler() { } private void clearHandler() { + this.list.setSelectingAll(false); this.list.setSelected(new HashSet<>()); } diff --git a/src/main/java/com/databasepreservation/common/client/common/lists/utils/AsyncTableCell.java b/src/main/java/com/databasepreservation/common/client/common/lists/utils/AsyncTableCell.java index 1b84dd84..0619d98a 100644 --- a/src/main/java/com/databasepreservation/common/client/common/lists/utils/AsyncTableCell.java +++ b/src/main/java/com/databasepreservation/common/client/common/lists/utils/AsyncTableCell.java @@ -48,6 +48,7 @@ import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; @@ -103,16 +104,13 @@ protected enum TextAlign { private FlowPanel mainPanel; private FlowPanel sidePanel; - private FlowPanel selectAllPanel; - private FlowPanel selectAllPanelBody; - private Label selectAllLabel; - private CheckBox selectAllCheckBox; private Column selectColumn; private Set selected = new HashSet(); private boolean persistSelections = false; private Set persistedSelectedUUIDs = new HashSet<>(); private final List> listeners = new ArrayList>(); + private boolean selectingAll = false; private Filter filter; private boolean justActive; @@ -204,8 +202,6 @@ protected void fireChangeEvent(IndexResult result) { pageSizePager = new RodaPageSizePager(getInitialPageSize(), getPageSizePagerIncrement()); pageSizePager.setDisplay(display); - createSelectAllPanel(); - displayScroll = new ScrollPanel(display); displayScroll.addStyleName("ms-scroll-fix"); displayScrollWrapper = new SimplePanel(displayScroll); @@ -243,7 +239,6 @@ protected void fireChangeEvent(IndexResult result) { addValueChangeHandler(event -> { selected = new HashSet<>(); - hideSelectAllPanel(); }); sidePanel = new FlowPanel(); @@ -254,7 +249,6 @@ protected void fireChangeEvent(IndexResult result) { mainPanel.addStyleName("my-asyncdatagrid-main-panel"); add(mainPanel); - mainPanel.add(selectAllPanel); mainPanel.add(displayScrollWrapper); mainPanel.add(resultsPager); if (exportButtons != null) { @@ -312,17 +306,49 @@ protected void handleScrollChanges() { private void configure(final CellTable display) { if (selectable) { - selectColumn = new Column(new CheckboxCell(true, false)) { + selectColumn = new Column(new CheckboxCell(true, false) { + private final SafeHtml INPUT_CHECKED = SafeHtmlUtils + .fromSafeConstant(""); + private final SafeHtml INPUT_CHECKED_DISABLED = SafeHtmlUtils + .fromSafeConstant(""); + private final SafeHtml INPUT_UNCHECKED = SafeHtmlUtils + .fromSafeConstant(""); + @Override - public Boolean getValue(T object) { - if (persistSelections) { - if (object == null) { - return false; + public void render(Context context, Boolean value, SafeHtmlBuilder sb) { + // Get the view data. + Object key = context.getKey(); + Boolean viewData = getViewData(key); + if (viewData != null && viewData.equals(value)) { + clearViewData(key); + viewData = null; + } + + if (selectingAll) { + sb.append(INPUT_CHECKED_DISABLED); + } else { + if (value != null && ((viewData != null) ? viewData : value)) { + sb.append(INPUT_CHECKED); } else { - return persistedSelectedUUIDs.contains(object.getUuid()); + sb.append(INPUT_UNCHECKED); } + } + } + }) { + @Override + public Boolean getValue(T object) { + if (selectingAll) { + return true; } else { - return selected.contains(object); + if (persistSelections) { + if (object == null) { + return false; + } else { + return persistedSelectedUUIDs.contains(object.getUuid()); + } + } else { + return selected.contains(object); + } } } }; @@ -341,60 +367,47 @@ public Boolean getValue(T object) { fireOnCheckboxSelectionChanged(); }); - Header selectHeader = new Header(new CheckboxCell(true, true)) { + Header selectHeader = new Header(new CheckboxCell(true, true) { + private final SafeHtml INPUT_OPEN = SafeHtmlUtils.fromSafeConstant("<"); + private final SafeHtml INPUT_CLOSE = SafeHtmlUtils.fromSafeConstant("/>"); + private final SafeHtml INPUT_CHECKED = SafeHtmlUtils + .fromSafeConstant("input type=\"checkbox\" tabindex=\"-1\" checked"); + private final SafeHtml INPUT_UNCHECKED = SafeHtmlUtils + .fromSafeConstant("input type=\"checkbox\" tabindex=\"-1\""); + + private SafeHtml makeTooltip() { + return SafeHtmlUtils.fromSafeConstant(" title=\"Select all " + dataProvider.getRowCount() + " items\" "); + } @Override - public Boolean getValue() { - Boolean ret; - - if (!persistSelections) { - if (selected.isEmpty()) { - ret = false; - } else if (selected.containsAll(getVisibleItems())) { - ret = true; - showSelectAllPanel(); - } else { - // some are selected - ret = false; - hideSelectAllPanel(); - } + public void render(Context context, Boolean value, SafeHtmlBuilder sb) { + // Get the view data. + Object key = context.getKey(); + Boolean viewData = getViewData(key); + if (viewData != null && viewData.equals(value)) { + clearViewData(key); + viewData = null; + } + + sb.append(INPUT_OPEN); + if (value != null && ((viewData != null) ? viewData : value)) { + sb.append(INPUT_CHECKED); } else { - Collection visibleUUIDs = new ArrayList<>(); - for (T item : getVisibleItems()) { - if (item != null) { - visibleUUIDs.add(item.getUuid()); - } - } - if (persistedSelectedUUIDs.isEmpty()) { - ret = false; - } else if (persistedSelectedUUIDs.containsAll(visibleUUIDs)) { - ret = true; - showSelectAllPanel(); - } else { - // some are selected - ret = false; - hideSelectAllPanel(); - } + sb.append(INPUT_UNCHECKED); } + sb.append(makeTooltip()); + sb.append(INPUT_CLOSE); + } + }) { - return ret; + @Override + public Boolean getValue() { + return selectingAll; } }; selectHeader.setUpdater(value -> { - if (value) { - for (T item : getVisibleItems()) { - persistedSelectedUUIDs.add(item.getUuid()); - } - selected.addAll(getVisibleItems()); - showSelectAllPanel(); - } else { - for (T item : getVisibleItems()) { - persistedSelectedUUIDs.remove(item.getUuid()); - } - selected.clear(); - hideSelectAllPanel(); - } + selectingAll = value; redraw(); fireOnCheckboxSelectionChanged(); }); @@ -436,7 +449,6 @@ public SingleSelectionModel getSelectionModel() { public void refresh() { selected = new HashSet(); - hideSelectAllPanel(); display.setVisibleRangeAndClearData(new Range(0, getInitialPageSize()), true); getSelectionModel().clear(); } @@ -661,7 +673,7 @@ public void setSelectable(boolean selectable) { public SelectedItems getSelected() { SelectedItems ret; - if (isAllSelected()) { + if (getSelectingAll()) { ret = new SelectedItemsFilter(getFilter(), selectedClass.getName(), getJustActive()); } else { List ids = new ArrayList<>(); @@ -735,48 +747,12 @@ public void fireOnCheckboxSelectionChanged() { } } - // SELECT ALL PANEL - - public void createSelectAllPanel() { - selectAllPanel = new FlowPanel(); - selectAllPanelBody = new FlowPanel(); - selectAllCheckBox = new CheckBox(); - selectAllLabel = new Label("Select all"); - - selectAllPanelBody.add(selectAllCheckBox); - selectAllPanelBody.add(selectAllLabel); - selectAllPanel.add(selectAllPanelBody); - selectAllPanel.setVisible(false); - - selectAllPanel.addStyleName("panel"); - selectAllPanelBody.addStyleName("panel-body"); - - selectAllCheckBox.addValueChangeHandler(new ValueChangeHandler() { - - @Override - public void onValueChange(ValueChangeEvent event) { - fireOnCheckboxSelectionChanged(); - } - }); - - } - - public void showSelectAllPanel() { - if (!selectAllPanel.isVisible() && resultsPager.hasNextPage() || resultsPager.hasPreviousPage()) { - // selectAllLabel.setText(messages.listSelectAllMessage(dataProvider.getRowCount())); - selectAllLabel.setText("Select all " + dataProvider.getRowCount() + " items"); - selectAllCheckBox.setValue(false); - selectAllPanel.setVisible(true); - } - } - - public void hideSelectAllPanel() { - selectAllCheckBox.setValue(false); - selectAllPanel.setVisible(false); + public Boolean getSelectingAll() { + return selectingAll; } - public Boolean isAllSelected() { - return selectAllCheckBox.getValue(); + public void setSelectingAll(boolean value) { + this.selectingAll = value; } public O getObject() {