/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.wui.client.common.slider; import java.util.Arrays; import java.util.List; import org.roda.core.data.common.RodaConstants; import org.roda.core.data.v2.index.IndexResult; import org.roda.core.data.v2.index.IsIndexed; import org.roda.core.data.v2.index.facet.Facets; import org.roda.core.data.v2.index.filter.Filter; import org.roda.core.data.v2.index.filter.SimpleFilterParameter; import org.roda.core.data.v2.index.sort.SortParameter; import org.roda.core.data.v2.index.sort.Sorter; import org.roda.core.data.v2.index.sublist.Sublist; import org.roda.core.data.v2.ip.IndexedAIP; import org.roda.core.data.v2.ip.IndexedDIP; import org.roda.core.data.v2.ip.IndexedFile; import org.roda.core.data.v2.ip.IndexedRepresentation; import org.roda.wui.client.browse.BrowserService; import org.roda.wui.client.common.actions.Actionable; import org.roda.wui.client.common.actions.DisseminationActions; import org.roda.wui.client.common.popup.CalloutPopup; import org.roda.wui.client.common.popup.CalloutPopup.CalloutPosition; import org.roda.wui.client.common.utils.AsyncCallbackUtils; import org.roda.wui.client.common.utils.StringUtils; import org.roda.wui.common.client.tools.HistoryUtils; import org.roda.wui.common.client.widgets.Toast; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.UIObject; import config.i18n.client.ClientMessages; public class DisseminationsSliderHelper { private static final ClientMessages messages = GWT.create(ClientMessages.class); private DisseminationsSliderHelper() { // do nothing } private static void updateDisseminationsSliderPanel(final IndexedAIP aip, final SliderPanel disseminationsSliderPanel) { Filter filter = new Filter(new SimpleFilterParameter(RodaConstants.DIP_AIP_UUIDS, aip.getUUID())); updateDisseminations(filter, disseminationsSliderPanel); } private static void updateDisseminationsSliderPanel(IndexedRepresentation representation, final SliderPanel disseminationsSliderPanel) { Filter filter = new Filter( new SimpleFilterParameter(RodaConstants.DIP_REPRESENTATION_UUIDS, representation.getUUID())); updateDisseminations(filter, disseminationsSliderPanel); } private static void updateDisseminationsSliderPanel(IndexedFile file, final SliderPanel disseminationsSliderPanel) { Filter filter = new Filter(new SimpleFilterParameter(RodaConstants.DIP_FILE_UUIDS, file.getUUID())); updateDisseminations(filter, disseminationsSliderPanel); } private static void updateDisseminations(Filter filter, final SliderPanel disseminationsSliderPanel) { Sorter sorter = new Sorter(new SortParameter(RodaConstants.DIP_DATE_CREATED, true)); Sublist sublist = new Sublist(0, 100); Facets facets = Facets.NONE; String localeString = LocaleInfo.getCurrentLocale().getLocaleName(); boolean justActive = true; List<String> dipFields = Arrays.asList(RodaConstants.INDEX_UUID, RodaConstants.DIP_ID, RodaConstants.DIP_TITLE, RodaConstants.DIP_DESCRIPTION, RodaConstants.DIP_DELETE_EXTERNAL_URL, RodaConstants.DIP_OPEN_EXTERNAL_URL); BrowserService.Util.getInstance().find(IndexedDIP.class.getName(), filter, sorter, sublist, facets, localeString, justActive, dipFields, new AsyncCallback<IndexResult<IndexedDIP>>() { @Override public void onFailure(Throwable caught) { AsyncCallbackUtils.defaultFailureTreatment(caught); } @Override public void onSuccess(IndexResult<IndexedDIP> result) { updateDisseminationsSliderPanel(result.getResults(), disseminationsSliderPanel); } }); } private static void updateDisseminationsSliderPanel(List<IndexedDIP> dips, SliderPanel disseminationsSliderPanel) { disseminationsSliderPanel.clear(); disseminationsSliderPanel.addTitle(new Label(messages.viewRepresentationFileDisseminationTitle())); if (dips.isEmpty()) { Label dipEmpty = new Label(messages.browseFileDipEmpty()); disseminationsSliderPanel.addContent(dipEmpty); dipEmpty.addStyleName("dip-empty"); } else { for (final IndexedDIP dip : dips) { disseminationsSliderPanel.addContent(createDisseminationPanel(dip)); } } } private static FlowPanel createDisseminationPanel(final IndexedDIP dip) { FlowPanel layout = new FlowPanel(); // open layout FlowPanel leftLayout = new FlowPanel(); Label titleLabel = new Label(dip.getTitle()); Label descriptionLabel = new Label(dip.getDescription()); leftLayout.add(titleLabel); leftLayout.add(descriptionLabel); FocusPanel openFocus = new FocusPanel(leftLayout); layout.add(openFocus); // options HTML optionsIcon = new HTML(SafeHtmlUtils.fromSafeConstant("<i class='fa fa-ellipsis-v'></i>")); final FocusPanel optionsButton = new FocusPanel(optionsIcon); optionsButton.addStyleName("lightbtn"); optionsIcon.addStyleName("lightbtn-icon"); optionsButton.setTitle(messages.browseFileDipDelete()); optionsButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showActions(dip, optionsButton); } }); layout.add(optionsButton); titleLabel.addStyleName("dipTitle"); descriptionLabel.addStyleName("dipDescription"); layout.addStyleName("dip"); leftLayout.addStyleName("dip-left"); openFocus.addStyleName("dip-focus"); optionsButton.addStyleName("dip-options"); openFocus.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { BrowserService.Util.getInstance().showDIPEmbedded(new AsyncCallback<Boolean>() { @Override public void onFailure(Throwable caught) { AsyncCallbackUtils.defaultFailureTreatment(caught); } @Override public void onSuccess(Boolean showEmbedded) { if (StringUtils.isNotBlank(dip.getOpenExternalURL()) && !showEmbedded) { Window.open(dip.getOpenExternalURL(), "_blank", ""); Toast.showInfo(messages.browseFileDipOpenedExternalURL(), dip.getOpenExternalURL()); } else { HistoryUtils.openBrowse(dip); } } }); } }); return layout; } protected static <T extends IsIndexed> void updateDisseminationsObjectSliderPanel(final T object, final SliderPanel disseminationsSliderPanel) { if (object instanceof IndexedAIP) { updateDisseminationsSliderPanel((IndexedAIP) object, disseminationsSliderPanel); } else if (object instanceof IndexedRepresentation) { updateDisseminationsSliderPanel((IndexedRepresentation) object, disseminationsSliderPanel); } else if (object instanceof IndexedFile) { updateDisseminationsSliderPanel((IndexedFile) object, disseminationsSliderPanel); } else { // do nothing } } protected static void showActions(final IndexedDIP dip, final UIObject actionsButton) { final CalloutPopup actionsPopup = new CalloutPopup(); if (actionsPopup.isShowing()) { actionsPopup.hide(); } else { AsyncCallback<Actionable.ActionImpact> callback = new AsyncCallback<Actionable.ActionImpact>() { @Override public void onFailure(Throwable caught) { AsyncCallbackUtils.defaultFailureTreatment(caught); } @Override public void onSuccess(Actionable.ActionImpact impact) { if (!Actionable.ActionImpact.NONE.equals(impact)) { // update } actionsPopup.hide(); } }; actionsPopup.setWidget(DisseminationActions.get().createActionsLayout(dip, callback)); actionsPopup.showRelativeTo(actionsButton, CalloutPosition.TOP_RIGHT); } } }