From 5505740ccf4722d1dcc6f3183238f16f9452d56c Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 25 Feb 2019 11:47:58 +0000 Subject: [PATCH] added portal functionality to filter out unnecessary UI components when iframing RODA on other applications --- .../roda/core/data/common/RodaConstants.java | 3 +- .../java/org/roda/core/RodaCoreFactory.java | 4 +- roda-ui/roda-wui/pom.xml | 156 ++++++ .../java/org/roda/wui/RodaWUIPortal.gwt.xml | 45 ++ .../org/roda/wui/api/controllers/Browser.java | 8 +- .../wui/api/controllers/BrowserHelper.java | 34 +- .../org/roda/wui/api/v1/AipsResource.java | 5 +- .../wui/api/v1/RepresentationsResource.java | 3 +- .../wui/client/browse/BitstreamPreview.java | 3 +- .../org/roda/wui/client/browse/BrowseDIP.java | 3 - .../roda/wui/client/browse/BrowseTop.ui.xml | 2 - .../wui/client/browse/BrowserService.java | 4 +- .../wui/client/common/NavigationToolbar.java | 9 +- .../wui/client/common/UserLoginService.java | 3 +- .../common/lists/utils/AsyncTableCell.java | 3 +- .../client/common/utils/IndexedDIPUtils.java | 1 - .../java/org/roda/wui/client/main/Main.java | 5 +- .../management/UserManagementService.java | 3 +- .../wui/client/portal/BrowseAIPPortal.java | 445 ++++++++++++++++++ .../wui/client/portal/BrowseAIPPortal.ui.xml | 39 ++ .../wui/client/portal/ContentPanelPortal.java | 206 ++++++++ .../roda/wui/client/portal/MainPortal.java | 122 +++++ .../roda/wui/client/portal/MainPortal.ui.xml | 12 + .../roda/wui/client/portal/SearchPortal.java | 82 ++++ .../wui/client/portal/SearchPortal.ui.xml | 16 + .../portal/SearchWithPreFiltersPortal.java | 53 +++ .../portal/SearchWithPreFiltersPortal.ui.xml | 17 + .../common/client/ClientLoggerService.java | 3 +- .../wui/common/client/tools/HistoryUtils.java | 22 +- .../wui/common/client/tools/RestUtils.java | 7 +- .../config/i18n/ServerMessages.properties | 2 + .../main/resources/config/roda-wui.properties | 6 + .../config/theme/PreChildrenPortal.html | 0 .../config/theme/PreDisseminationsPortal.html | 0 .../config/theme/PreMetadataPortal.html | 0 roda-ui/roda-wui/src/main/webapp/Portal.html | 97 ++++ .../roda-wui/src/main/webapp/WEB-INF/web.xml | 8 +- 37 files changed, 1384 insertions(+), 47 deletions(-) create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/RodaWUIPortal.gwt.xml create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.java create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.ui.xml create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/ContentPanelPortal.java create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.java create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.ui.xml create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.java create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.ui.xml create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.java create mode 100644 roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.ui.xml create mode 100644 roda-ui/roda-wui/src/main/resources/config/theme/PreChildrenPortal.html create mode 100644 roda-ui/roda-wui/src/main/resources/config/theme/PreDisseminationsPortal.html create mode 100644 roda-ui/roda-wui/src/main/resources/config/theme/PreMetadataPortal.html create mode 100644 roda-ui/roda-wui/src/main/webapp/Portal.html diff --git a/roda-common/roda-common-data/src/main/java/org/roda/core/data/common/RodaConstants.java b/roda-common/roda-common-data/src/main/java/org/roda/core/data/common/RodaConstants.java index 868f5cbee7..8fe1f3a64a 100644 --- a/roda-common/roda-common-data/src/main/java/org/roda/core/data/common/RodaConstants.java +++ b/roda-common/roda-common-data/src/main/java/org/roda/core/data/common/RodaConstants.java @@ -56,7 +56,8 @@ public final class RodaConstants { /* * Misc */ - public static final String INSTALL_FOLDER_ENVIRONEMNT_VARIABLE = "RODA_HOME"; + public static final String INSTALL_FOLDER_ENVIRONMENT_VARIABLE = "RODA_HOME"; + public static final String GWT_RPC_BASE_URL = "gwtrpc/"; /** * XXX Use DateTimeFormatter.ISO_INSTANT instead when GWT supports Instant diff --git a/roda-core/roda-core/src/main/java/org/roda/core/RodaCoreFactory.java b/roda-core/roda-core/src/main/java/org/roda/core/RodaCoreFactory.java index 0355957dfc..d318340cc8 100644 --- a/roda-core/roda-core/src/main/java/org/roda/core/RodaCoreFactory.java +++ b/roda-core/roda-core/src/main/java/org/roda/core/RodaCoreFactory.java @@ -647,8 +647,8 @@ private static Path determineRodaHomePath() { Path rodaHomePath; if (System.getProperty(RodaConstants.INSTALL_FOLDER_SYSTEM_PROPERTY) != null) { rodaHomePath = Paths.get(System.getProperty(RodaConstants.INSTALL_FOLDER_SYSTEM_PROPERTY)); - } else if (System.getenv(RodaConstants.INSTALL_FOLDER_ENVIRONEMNT_VARIABLE) != null) { - rodaHomePath = Paths.get(System.getenv(RodaConstants.INSTALL_FOLDER_ENVIRONEMNT_VARIABLE)); + } else if (System.getenv(RodaConstants.INSTALL_FOLDER_ENVIRONMENT_VARIABLE) != null) { + rodaHomePath = Paths.get(System.getenv(RodaConstants.INSTALL_FOLDER_ENVIRONMENT_VARIABLE)); } else { // last attempt (using user home and hidden directory called .roda) String userHome = System.getProperty("user.home"); diff --git a/roda-ui/roda-wui/pom.xml b/roda-ui/roda-wui/pom.xml index bd21664e4e..7df943efc9 100644 --- a/roda-ui/roda-wui/pom.xml +++ b/roda-ui/roda-wui/pom.xml @@ -166,6 +166,162 @@ + + default-portal + + true + + + + + org.codehaus.mojo + gwt-maven-plugin + + org.roda.wui.RodaWUIPortal/Portal.html + target/classes + + + + compile-gwt + prepare-package + + compile + + + + + + maven-clean-plugin + + + + ${basedir} + + gwt-unitCache/ + + + + src/main + + gwt-unitCache/** + webapp/org.roda.wui.RodaWUI/** + webapp/org.roda.wui.RodaWUIPortal/** + webapp/WEB-INF/deploy/** + webapp/WEB-INF/classes/** + + false + + + + + + gwt-clean + initialize + + clean + + + + + + pl.project13.maven + git-commit-id-plugin + + false + + + + + + + roda-wui-docker-portal + + + + org.codehaus.mojo + gwt-maven-plugin + + org.roda.wui.RodaWUIPortal/Portal.html + target/classes + + + + compile-gwt + prepare-package + + compile + + + + + + maven-clean-plugin + + + + ${basedir} + + gwt-unitCache/ + + + + src/main + + gwt-unitCache/** + webapp/org.roda.wui.RodaWUI/** + webapp/org.roda.wui.RodaWUIPortal/** + webapp/WEB-INF/deploy/** + webapp/WEB-INF/classes/** + + false + + + + + + gwt-clean + initialize + + clean + + + + + + com.spotify + docker-maven-plugin + + true + keeps/roda + + ${project.version} + latest + + ${project.basedir}/docker-files + + + /ROOT + ${project.build.directory}/${project.build.finalName} + false + + + + + + package + + build + + + + + + pl.project13.maven + git-commit-id-plugin + + + + diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/RodaWUIPortal.gwt.xml b/roda-ui/roda-wui/src/main/java/org/roda/wui/RodaWUIPortal.gwt.xml new file mode 100644 index 0000000000..494f0d86db --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/RodaWUIPortal.gwt.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/Browser.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/Browser.java index 24abaccb6c..dda619fe85 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/Browser.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/Browser.java @@ -579,7 +579,7 @@ public static StreamResponse retrieveAIPRepresentationPart(User user, String aip } public static EntityResponse listAIPDescriptiveMetadata(User user, String aipId, String start, String limit, - String acceptFormat) + String acceptFormat, String language) throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException { final ControllerAssistant controllerAssistant = new ControllerAssistant() {}; @@ -596,7 +596,7 @@ public static EntityResponse listAIPDescriptiveMetadata(User user, String aipId, controllerAssistant.checkObjectPermissions(user, aip); // delegate - return BrowserHelper.listAIPDescriptiveMetadata(aipId, start, limit, acceptFormat); + return BrowserHelper.listAIPDescriptiveMetadata(aipId, start, limit, acceptFormat, language); } catch (RODAException e) { state = LOG_ENTRY_STATE.FAILURE; throw e; @@ -608,7 +608,7 @@ public static EntityResponse listAIPDescriptiveMetadata(User user, String aipId, } public static EntityResponse listRepresentationDescriptiveMetadata(User user, String aipId, String representationId, - String start, String limit, String acceptFormat) + String start, String limit, String acceptFormat, String language) throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException { ControllerAssistant controllerAssistant = new ControllerAssistant() {}; @@ -627,7 +627,7 @@ public static EntityResponse listRepresentationDescriptiveMetadata(User user, St // delegate return BrowserHelper.listRepresentationDescriptiveMetadata(representation.getAipId(), representation.getId(), - start, limit, acceptFormat); + start, limit, acceptFormat, language); } catch (RODAException e) { state = LOG_ENTRY_STATE.FAILURE; throw e; diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/BrowserHelper.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/BrowserHelper.java index 638607895c..758304eec1 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/BrowserHelper.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/controllers/BrowserHelper.java @@ -839,12 +839,13 @@ protected static void validateListAIPDescriptiveMetadataParams(String acceptForm if (!RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP.equals(acceptFormat) && !RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_JSON.equals(acceptFormat) && !RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_XML.equals(acceptFormat) - && !RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_JSONP.equals(acceptFormat)) { + && !RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_JSONP.equals(acceptFormat) + && !RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_HTML.equals(acceptFormat)) { throw new RequestNotValidException( "Invalid '" + RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT + "' value. Expected values: " + Arrays.asList(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP, RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_JSON, RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_JSONP, - RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_XML)); + RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_XML, RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_HTML)); } } @@ -862,25 +863,25 @@ public static void validateGetOtherMetadataParams(String acceptFormat) throws Re } protected static EntityResponse listAIPDescriptiveMetadata(String aipId, String start, String limit, - String acceptFormat) + String acceptFormat, String language) throws RequestNotValidException, NotFoundException, GenericException, AuthorizationDeniedException { ModelService model = RodaCoreFactory.getModelService(); AIP aip = model.retrieveAIP(aipId); List metadata = aip.getDescriptiveMetadata(); - return listDescriptiveMetadata(metadata, aipId, start, limit, acceptFormat); + return listDescriptiveMetadata(metadata, aipId, start, limit, acceptFormat, language); } protected static EntityResponse listRepresentationDescriptiveMetadata(String aipId, String representationId, - String start, String limit, String acceptFormat) + String start, String limit, String acceptFormat, String language) throws RequestNotValidException, NotFoundException, GenericException, AuthorizationDeniedException { ModelService model = RodaCoreFactory.getModelService(); Representation representation = model.retrieveRepresentation(aipId, representationId); List metadata = representation.getDescriptiveMetadata(); - return listDescriptiveMetadata(metadata, aipId, start, limit, acceptFormat); + return listDescriptiveMetadata(metadata, aipId, start, limit, acceptFormat, language); } private static EntityResponse listDescriptiveMetadata(List metadata, String aipId, String start, - String limit, String acceptFormat) + String limit, String acceptFormat, String language) throws RequestNotValidException, GenericException, NotFoundException, AuthorizationDeniedException { StorageService storage = RodaCoreFactory.getStorageService(); Pair pagingParams = ApiUtils.processPagingParams(start, limit); @@ -903,6 +904,25 @@ private static EntityResponse listDescriptiveMetadata(List } return DownloadUtils.createZipStreamResponse(zipEntries, aipId); + } else if (RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_HTML.equals(acceptFormat)) { + ModelService model = RodaCoreFactory.getModelService(); + List> htmlDescriptives = new ArrayList<>(); + + for (DescriptiveMetadata dm : metadata) { + Binary descriptiveMetadataBinary = model.retrieveDescriptiveMetadataBinary(aipId, dm.getId()); + DescriptiveMetadata descriptiveMetadata = model.retrieveDescriptiveMetadata(aipId, dm.getId()); + htmlDescriptives.add(Pair.of(dm.getId(), HTMLUtils.descriptiveMetadataToHtml(descriptiveMetadataBinary, + descriptiveMetadata.getType(), descriptiveMetadata.getVersion(), ServerTools.parseLocale(language)))); + } + + return new StreamResponse( + new DefaultConsumesOutputStream(aipId + HTML_EXT, RodaConstants.MEDIA_TYPE_TEXT_HTML, out -> { + PrintStream printStream = new PrintStream(out); + for (Pair htmlDescriptive : htmlDescriptives) { + printStream.print(htmlDescriptive.getSecond()); + } + printStream.close(); + })); } else if (RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_JSON.equals(acceptFormat) || RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_XML.equals(acceptFormat) || RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_JSONP.equals(acceptFormat)) { diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/AipsResource.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/AipsResource.java index 2f3737a120..8ef250fc29 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/AipsResource.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/AipsResource.java @@ -213,7 +213,7 @@ public Response deleteAIP( @GET @Path("/{" + RodaConstants.API_PATH_PARAM_AIP_ID + "}/" + RodaConstants.API_DESCRIPTIVE_METADATA + "/") @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, ExtraMediaType.APPLICATION_ZIP, - ExtraMediaType.APPLICATION_JAVASCRIPT}) + ExtraMediaType.APPLICATION_JAVASCRIPT, MediaType.TEXT_HTML}) @JSONP(callback = RodaConstants.API_QUERY_DEFAULT_JSONP_CALLBACK, queryParam = RodaConstants.API_QUERY_KEY_JSONP_CALLBACK) @ApiOperation(value = "List descriptive metadata", notes = "List descriptive metadata", response = DescriptiveMetadataList.class, responseContainer = "List") @ApiResponses(value = { @@ -225,6 +225,7 @@ public Response retrieveDescriptiveMetadataListFromAIP( @ApiParam(value = "Index of the first element to return", defaultValue = "0") @QueryParam(RodaConstants.API_QUERY_KEY_START) String start, @ApiParam(value = "Maximum number of elements to return", defaultValue = RodaConstants.DEFAULT_PAGINATION_STRING_VALUE) @QueryParam(RodaConstants.API_QUERY_KEY_LIMIT) String limit, @ApiParam(value = "Choose format in which to get the list", allowableValues = RodaConstants.API_GET_LIST_MEDIA_TYPES) @QueryParam(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT) String acceptFormat, + @ApiParam(value = "The language for the HTML output", allowableValues = RodaConstants.API_DESCRIPTIVE_METADATA_LANGUAGES, defaultValue = RodaConstants.API_QUERY_VALUE_LANG_DEFAULT) @DefaultValue(RodaConstants.API_QUERY_VALUE_LANG_DEFAULT) @QueryParam(RodaConstants.API_QUERY_KEY_LANG) String language, @ApiParam(value = "JSONP callback name", required = false, allowMultiple = false, defaultValue = RodaConstants.API_QUERY_DEFAULT_JSONP_CALLBACK) @QueryParam(RodaConstants.API_QUERY_KEY_JSONP_CALLBACK) String jsonpCallbackName) throws RODAException { String mediaType = ApiUtils.getMediaType(acceptFormat, request); @@ -233,7 +234,7 @@ public Response retrieveDescriptiveMetadataListFromAIP( User user = UserUtility.getApiUser(request); // delegate action to controller - EntityResponse metadataList = Browser.listAIPDescriptiveMetadata(user, aipId, start, limit, acceptFormat); + EntityResponse metadataList = Browser.listAIPDescriptiveMetadata(user, aipId, start, limit, acceptFormat, language); if (metadataList instanceof ObjectResponse) { ObjectResponse dmlist = (ObjectResponse) metadataList; diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/RepresentationsResource.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/RepresentationsResource.java index 23339a1eb5..d350f44a7d 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/RepresentationsResource.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/api/v1/RepresentationsResource.java @@ -241,6 +241,7 @@ public Response retrieveDescriptiveMetadataListFromRepresentation( @ApiParam(value = "Index of the first element to return", defaultValue = "0") @QueryParam(RodaConstants.API_QUERY_KEY_START) String start, @ApiParam(value = "Maximum number of elements to return", defaultValue = "100") @QueryParam(RodaConstants.API_QUERY_KEY_LIMIT) String limit, @ApiParam(value = "Choose format in which to get the representation", allowableValues = RodaConstants.API_GET_LIST_MEDIA_TYPES) @QueryParam(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT) String acceptFormat, + @ApiParam(value = "The language for the HTML output", allowableValues = RodaConstants.API_DESCRIPTIVE_METADATA_LANGUAGES, defaultValue = RodaConstants.API_QUERY_VALUE_LANG_DEFAULT) @DefaultValue(RodaConstants.API_QUERY_VALUE_LANG_DEFAULT) @QueryParam(RodaConstants.API_QUERY_KEY_LANG) String language, @ApiParam(value = "JSONP callback name", required = false, allowMultiple = false, defaultValue = RodaConstants.API_QUERY_DEFAULT_JSONP_CALLBACK) @QueryParam(RodaConstants.API_QUERY_KEY_JSONP_CALLBACK) String jsonpCallbackName) throws RODAException { String mediaType = ApiUtils.getMediaType(acceptFormat, request); @@ -250,7 +251,7 @@ public Response retrieveDescriptiveMetadataListFromRepresentation( // delegate action to controller EntityResponse metadataList = Browser.listRepresentationDescriptiveMetadata(user, aipId, representationId, start, - limit, acceptFormat); + limit, acceptFormat, language); if (metadataList instanceof ObjectResponse) { ObjectResponse dmlist = (ObjectResponse) metadataList; diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BitstreamPreview.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BitstreamPreview.java index 30477d9575..aa8f53d9fd 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BitstreamPreview.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BitstreamPreview.java @@ -237,15 +237,14 @@ private void pdfPreview() { @Override public void onAttachOrDetach(AttachEvent attachEvent) { if (attachEvent.isAttached()) { - GWT.log("add handler"); adjustPdfPreviewHeight(frame); handlerRegistration = Window.addResizeHandler(resizeEvent -> adjustPdfPreviewHeight(frame)); } else if (handlerRegistration != null) { - GWT.log("remove handler"); handlerRegistration.removeHandler(); } } }); + panel.add(frame); frame.setStyleName("viewRepresentationPDFFilePreview"); } diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseDIP.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseDIP.java index 759cccd3f4..0644db9a72 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseDIP.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseDIP.java @@ -124,7 +124,6 @@ public void onSuccess(BrowseDipBundle browseDipBundle) { callback.onSuccess(new BrowseDIP(viewers, browseDipBundle)); } }); - } else { errorRedirect(callback); } @@ -144,8 +143,6 @@ interface MyUiBinder extends UiBinder { private static final ClientMessages messages = GWT.create(ClientMessages.class); public static final Sorter DEFAULT_DIPFILE_SORTER = new Sorter(new SortParameter(RodaConstants.DIPFILE_ID, false)); - private ClientLogger logger = new ClientLogger(getClass().getName()); - // interface @UiField diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseTop.ui.xml b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseTop.ui.xml index be7b4e2b97..922ad66693 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseTop.ui.xml +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseTop.ui.xml @@ -2,9 +2,7 @@ diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowserService.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowserService.java index 71ff6cdd08..76cf763719 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowserService.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowserService.java @@ -13,6 +13,7 @@ import java.util.Map; import java.util.Set; +import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.AlreadyExistsException; import org.roda.core.data.exceptions.AuthorizationDeniedException; import org.roda.core.data.exceptions.GenericException; @@ -92,10 +93,9 @@ private Util() { * @return the instance */ public static BrowserServiceAsync getInstance() { - BrowserServiceAsync instance = (BrowserServiceAsync) GWT.create(BrowserService.class); ServiceDefTarget target = (ServiceDefTarget) instance; - target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI); + target.setServiceEntryPoint(GWT.getHostPageBaseURL() + RodaConstants.GWT_RPC_BASE_URL + SERVICE_URI); return instance; } } diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/NavigationToolbar.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/NavigationToolbar.java index 7a4befaeac..e8f86b70e2 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/NavigationToolbar.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/NavigationToolbar.java @@ -248,6 +248,14 @@ private void setNavigationButtonTitles() { nextButton.setTitle(messages.searchNext()); } + public void setSearchButtonVisibility(boolean visible) { + searchButton.setVisible(visible); + } + + public void setActionsButtonVisibility(boolean visible) { + actionsButton.setVisible(visible); + } + public NavigationToolbar withActionImpactHandler(Actionable.ActionImpact actionImpact, Runnable handler) { this.handlers.put(actionImpact, handler); return this; @@ -348,7 +356,6 @@ public void updateBreadcrumb(BrowseRepresentationBundle bundle) { public void updateBreadcrumb(BrowseFileBundle bundle) { breadcrumb.updatePath(BreadcrumbUtils.getFileBreadcrumbs(bundle)); - aipState.setHTML(HtmlSnippetUtils.getAIPStateHTML(bundle.getAip().getState())); aipState.setVisible(AIPState.ACTIVE != bundle.getAip().getState()); } diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/UserLoginService.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/UserLoginService.java index dd98a2d518..144672908b 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/UserLoginService.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/UserLoginService.java @@ -12,6 +12,7 @@ import java.util.Map; +import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.AuthenticationDeniedException; import org.roda.core.data.exceptions.GenericException; import org.roda.core.data.exceptions.RODAException; @@ -46,7 +47,7 @@ public static UserLoginServiceAsync getInstance() { UserLoginServiceAsync instance = (UserLoginServiceAsync) GWT.create(UserLoginService.class); ServiceDefTarget target = (ServiceDefTarget) instance; - target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI); + target.setServiceEntryPoint(GWT.getHostPageBaseURL() + RodaConstants.GWT_RPC_BASE_URL + SERVICE_URI); return instance; } } diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/lists/utils/AsyncTableCell.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/lists/utils/AsyncTableCell.java index 827d5442fa..2e08efa613 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/lists/utils/AsyncTableCell.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/lists/utils/AsyncTableCell.java @@ -215,16 +215,17 @@ public void getData(Sublist sublist, Sorter sorter, List fieldsToReturn, @Override public void onFailure(Throwable caught) { callback.onFailure(caught); - } @Override public void onSuccess(IndexResult result) { setResult(result); callback.onSuccess(result); + if(redirectOnSingleResult && originalFilter.equals(AsyncTableCell.this.getFilter()) && getVisibleItems().size() == 1){ HistoryUtils.resolve(getVisibleItems().get(0), true); } + if (getVisibleItems().isEmpty()) { AsyncTableCell.this.addStyleName("table-empty"); } else { diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/utils/IndexedDIPUtils.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/utils/IndexedDIPUtils.java index aaa25c5c44..9cec6373d4 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/utils/IndexedDIPUtils.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/utils/IndexedDIPUtils.java @@ -20,7 +20,6 @@ private IndexedDIPUtils() { public static String interpolateOpenExternalURL(IndexedDIP dip, String locale) { Map replacements = new HashMap<>(); replacements.put("locale", locale); - return interpolateOpenExternalURL(dip, replacements); } diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/main/Main.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/main/Main.java index 02d0f4f574..61a268ccc6 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/main/Main.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/main/Main.java @@ -26,13 +26,11 @@ import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; -import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NodeList; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.History; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -58,7 +56,6 @@ public void onModuleLoad() { // Set uncaught exception handler ClientLogger.setUncaughtExceptionHandler(); - // load shared properties before init BrowserService.Util.getInstance().retrieveSharedProperties(LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback>>() { @@ -110,7 +107,7 @@ public Main() { */ public void init() { MyResources.INSTANCE.css().ensureInjected(); - + // Remove loading image RootPanel.getBodyElement().removeChild(DOM.getElementById("loading")); NodeList bodyChilds = RootPanel.getBodyElement().getElementsByTagName("iframe"); diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/management/UserManagementService.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/management/UserManagementService.java index bbd08a82f9..e3f2740f65 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/management/UserManagementService.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/management/UserManagementService.java @@ -10,6 +10,7 @@ */ package org.roda.wui.client.management; +import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.AlreadyExistsException; import org.roda.core.data.exceptions.AuthorizationDeniedException; import org.roda.core.data.exceptions.EmailAlreadyExistsException; @@ -58,7 +59,7 @@ public static UserManagementServiceAsync getInstance() { UserManagementServiceAsync instance = (UserManagementServiceAsync) GWT.create(UserManagementService.class); ServiceDefTarget target = (ServiceDefTarget) instance; - target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI); + target.setServiceEntryPoint(GWT.getHostPageBaseURL() + RodaConstants.GWT_RPC_BASE_URL + SERVICE_URI); return instance; } } diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.java new file mode 100644 index 0000000000..4d18952246 --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.java @@ -0,0 +1,445 @@ +/** + * 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.portal; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.roda.core.data.common.RodaConstants; +import org.roda.core.data.v2.index.IndexResult; +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.AIPState; +import org.roda.core.data.v2.ip.DIPFile; +import org.roda.core.data.v2.ip.IndexedAIP; +import org.roda.core.data.v2.ip.IndexedDIP; +import org.roda.wui.client.browse.BrowserService; +import org.roda.wui.client.browse.DipFilePreview; +import org.roda.wui.client.browse.Viewers; +import org.roda.wui.client.browse.bundle.BrowseAIPBundle; +import org.roda.wui.client.browse.bundle.DescriptiveMetadataViewBundle; +import org.roda.wui.client.common.LastSelectedItemsSingleton; +import org.roda.wui.client.common.NavigationToolbar; +import org.roda.wui.client.common.NoAsyncCallback; +import org.roda.wui.client.common.TitlePanel; +import org.roda.wui.client.common.UserLogin; +import org.roda.wui.client.common.actions.Actionable; +import org.roda.wui.client.common.lists.AIPList; +import org.roda.wui.client.common.lists.utils.AsyncTableCellOptions; +import org.roda.wui.client.common.lists.utils.ListBuilder; +import org.roda.wui.client.common.search.SearchWrapper; +import org.roda.wui.client.common.utils.AsyncCallbackUtils; +import org.roda.wui.client.common.utils.HtmlSnippetUtils; +import org.roda.wui.client.common.utils.PermissionClientUtils; +import org.roda.wui.common.client.HistoryResolver; +import org.roda.wui.common.client.tools.DescriptionLevelUtils; +import org.roda.wui.common.client.tools.HistoryUtils; +import org.roda.wui.common.client.tools.Humanize; +import org.roda.wui.common.client.tools.RestErrorOverlayType; +import org.roda.wui.common.client.tools.RestUtils; +import org.roda.wui.common.client.tools.StringUtils; +import org.roda.wui.common.client.widgets.HTMLWidgetWrapper; +import org.roda.wui.common.client.widgets.Toast; +import org.roda.wui.common.client.widgets.wcag.WCAGUtilities; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JsonUtils; +import com.google.gwt.dom.client.Element; +import com.google.gwt.http.client.Request; +import com.google.gwt.http.client.RequestBuilder; +import com.google.gwt.http.client.RequestCallback; +import com.google.gwt.http.client.RequestException; +import com.google.gwt.http.client.Response; +import com.google.gwt.i18n.client.LocaleInfo; +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.safehtml.shared.SafeUri; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +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.SimplePanel; +import com.google.gwt.user.client.ui.Widget; + +import config.i18n.client.ClientMessages; + +public class BrowseAIPPortal extends Composite { + private static SimplePanel container; + + public static final HistoryResolver RESOLVER = new HistoryResolver() { + + @Override + public void resolve(List historyTokens, AsyncCallback callback) { + if (historyTokens.size() == 1) { + BrowseAIPPortal.getAndRefresh(historyTokens.get(0), callback); + } else { + HistoryUtils.newHistory(RESOLVER); + callback.onSuccess(null); + } + } + + @Override + public void isCurrentUserPermitted(AsyncCallback callback) { + UserLogin.getInstance().checkRole(this, callback); + } + + @Override + public String getHistoryToken() { + return "browse"; + } + + @Override + public List getHistoryPath() { + return Arrays.asList(getHistoryToken()); + } + }; + + public static void getAndRefresh(String id, AsyncCallback callback) { + container = new SimplePanel(); + refresh(id, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + callback.onFailure(caught); + } + + @Override + public void onSuccess(BrowseAIPBundle result) { + callback.onSuccess(container); + } + }); + } + + private static void refresh(String id, AsyncCallback callback) { + BrowserService.Util.getInstance().retrieveBrowseAIPBundle(id, LocaleInfo.getCurrentLocale().getLocaleName(), + fieldsToReturn, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + callback.onFailure(caught); + } + + @Override + public void onSuccess(BrowseAIPBundle bundle) { + container.setWidget(new BrowseAIPPortal(bundle)); + callback.onSuccess(bundle); + } + }); + } + + private static final List fieldsToReturn = new ArrayList<>(RodaConstants.AIP_PERMISSIONS_FIELDS_TO_RETURN); + static { + fieldsToReturn.addAll( + Arrays.asList(RodaConstants.INDEX_UUID, RodaConstants.AIP_STATE, RodaConstants.AIP_TITLE, RodaConstants.AIP_LEVEL, + RodaConstants.INGEST_SIP_IDS, RodaConstants.INGEST_JOB_ID, RodaConstants.INGEST_UPDATE_JOB_IDS)); + } + + interface MyUiBinder extends UiBinder { + } + + private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + private static final ClientMessages messages = GWT.create(ClientMessages.class); + + private String aipId; + private IndexedAIP aip; + + // Focus + @UiField + FocusPanel keyboardFocus; + + // HEADER + + @UiField + NavigationToolbar navigationToolbar; + + // STATUS + + @UiField + HTML aipState; + + // IDENTIFICATION + @UiField + TitlePanel title; + + // DESCRIPTIVE METADATA + + @UiField + HTML descriptiveMetadata; + + @UiField + FlowPanel preMetadata; + + // DISSEMINATIONS + @UiField + SimplePanel disseminationsCard; + + @UiField + FlowPanel preDisseminations; + + // AIP CHILDREN + @UiField + SimplePanel aipChildrenCard; + + @UiField + FlowPanel preChildren; + + @UiField + FlowPanel center; + + @UiField + Label dateCreatedAndModified; + + private BrowseAIPPortal(BrowseAIPBundle bundle) { + aip = bundle.getAip(); + aipId = aip.getId(); + boolean justActive = AIPState.ACTIVE.equals(aip.getState()); + + // INIT + initWidget(uiBinder.createAndBindUi(this)); + preMetadata.add(new HTMLWidgetWrapper("PreMetadataPortal.html")); + preDisseminations.add(new HTMLWidgetWrapper("PreDisseminationsPortal.html")); + preChildren.add(new HTMLWidgetWrapper("PreChildrenPortal.html")); + preMetadata.addStyleName("preSectionTitle preMetadataTitle"); + preDisseminations.addStyleName("preSectionTitle preDisseminationsTitle"); + preChildren.addStyleName("preSectionTitle preChildrenTitle"); + + AsyncCallback listActionableCallback = new NoAsyncCallback() { + @Override + public void onSuccess(Actionable.ActionImpact impact) { + if (!Actionable.ActionImpact.NONE.equals(impact)) { + refresh(aipId, new NoAsyncCallback<>()); + } + } + }; + + // DISSEMINATIONS + disseminationsCard.setVisible(false); + preDisseminations.setVisible(false); + + if (PermissionClientUtils.hasPermissions(RodaConstants.PERMISSION_METHOD_FIND_DIP)) { + BrowserService.Util.getInstance().retrieveViewersProperties(new AsyncCallback() { + + @Override + public void onSuccess(Viewers viewers) { + Filter filter = new Filter(new SimpleFilterParameter(RodaConstants.DIP_AIP_UUIDS, aip.getId())); + Sorter sorter = new Sorter(new SortParameter(RodaConstants.DIP_DATE_CREATED, true)); + + BrowserService.Util.getInstance().find(IndexedDIP.class.getName(), filter, sorter, new Sublist(0, 1), + Facets.NONE, LocaleInfo.getCurrentLocale().getLocaleName(), true, + Arrays.asList(RodaConstants.INDEX_UUID, RodaConstants.DIP_ID), + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + AsyncCallbackUtils.defaultFailureTreatment(caught); + } + + @Override + public void onSuccess(IndexResult result) { + if (result.getTotalCount() > 0) { + String dipId = result.getResults().get(0).getId(); + Filter fileFilter = new Filter(new SimpleFilterParameter(RodaConstants.DIPFILE_DIP_ID, dipId)); + BrowserService.Util.getInstance().find( + DIPFile.class.getName(), fileFilter, Sorter.NONE, new Sublist(0, 1), Facets.NONE, + LocaleInfo.getCurrentLocale().getLocaleName(), true, Arrays.asList(RodaConstants.INDEX_UUID, + RodaConstants.DIPFILE_ID, RodaConstants.DIPFILE_SIZE, RodaConstants.DIPFILE_IS_DIRECTORY), + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + AsyncCallbackUtils.defaultFailureTreatment(caught); + } + + @Override + public void onSuccess(IndexResult result) { + if (result.getTotalCount() > 0) { + disseminationsCard.setVisible(true); + preDisseminations.setVisible(true); + disseminationsCard.add(new DipFilePreview(viewers, result.getResults().get(0))); + } + } + }); + } + } + }); + } + + @Override + public void onFailure(Throwable caught) { + AsyncCallbackUtils.treatCommonFailures(caught); + } + }); + } + + // AIP CHILDREN + preChildren.setVisible(false); + + if (PermissionClientUtils.hasPermissions(RodaConstants.PERMISSION_METHOD_FIND_AIP)) { + ListBuilder aipChildrenListBuilder = new ListBuilder<>(() -> new AIPList(), + new AsyncTableCellOptions<>(IndexedAIP.class, "BrowseAIPPortal_aipChildren") + .withFilter(new Filter(new SimpleFilterParameter(RodaConstants.AIP_PARENT_ID, aip.getId()))) + .withJustActive(justActive).withSummary(messages.listOfAIPs()).bindOpener() + .withActionableCallback(listActionableCallback)); + + SearchWrapper aipChildrenSearchWrapper = new SearchWrapper(false) + .createListAndSearchPanel(aipChildrenListBuilder); + aipChildrenCard.setWidget(aipChildrenSearchWrapper); + aipChildrenCard.setVisible(bundle.getChildAIPCount() > 0); + preChildren.setVisible(bundle.getChildAIPCount() > 0); + } + // CSS + addStyleName("browse browse_aip"); + + // make FocusPanel comply with WCAG + Element firstElement = this.getElement().getFirstChildElement(); + if ("input".equalsIgnoreCase(firstElement.getTagName())) { + firstElement.setAttribute("title", "browse input"); + } + + IndexedAIP aip = bundle.getAip(); + title.setIcon(DescriptionLevelUtils.getElementLevelIconSafeHtml(aip.getLevel(), false)); + title.setText(aip.getTitle() != null ? aip.getTitle() : aip.getId()); + + if (aip.getCreatedOn() != null && StringUtils.isNotBlank(aip.getCreatedBy()) && aip.getUpdatedOn() != null + && StringUtils.isNotBlank(aip.getUpdatedBy())) { + dateCreatedAndModified.setText(messages.dateCreatedAndUpdated(Humanize.formatDate(aip.getCreatedOn()), + aip.getCreatedBy(), Humanize.formatDate(aip.getUpdatedOn()), aip.getUpdatedBy())); + } else if (aip.getCreatedOn() != null && StringUtils.isNotBlank(aip.getCreatedBy())) { + dateCreatedAndModified + .setText(messages.dateCreated(Humanize.formatDateTime(aip.getCreatedOn()), aip.getCreatedBy())); + } else if (aip.getUpdatedOn() != null && StringUtils.isNotBlank(aip.getUpdatedBy())) { + dateCreatedAndModified + .setText(messages.dateUpdated(Humanize.formatDateTime(aip.getUpdatedOn()), aip.getUpdatedBy())); + } else { + dateCreatedAndModified.setText(""); + } + + // STATE + this.addStyleName(aip.getState().toString().toLowerCase()); + aipState.setHTML(HtmlSnippetUtils.getAIPStateHTML(aip.getState())); + aipState.setVisible(!justActive); + + // NAVIGATION TOOLBAR + navigationToolbar.withObject(aip); + navigationToolbar.withPermissions(aip.getPermissions()); + navigationToolbar.withActionImpactHandler(Actionable.ActionImpact.UPDATED, + () -> refresh(aipId, new NoAsyncCallback<>())); + navigationToolbar.build(); + navigationToolbar.setActionsButtonVisibility(false); + navigationToolbar.setSearchButtonVisibility(false); + + // DESCRIPTIVE METADATA + updateSectionDescriptiveMetadata(bundle); + + // AIP CHILDREN + if (bundle.getChildAIPCount() > 0) { + LastSelectedItemsSingleton.getInstance().setSelectedJustActive(justActive); + } + + keyboardFocus.setFocus(true); + } + + private void updateSectionDescriptiveMetadata(BrowseAIPBundle bundle) { + final List descriptiveMetadataContainers = new ArrayList<>(); + final Map bundles = new HashMap<>(); + + List descMetadata = bundle.getDescriptiveMetadata(); + if (descMetadata != null) { + for (DescriptiveMetadataViewBundle descMetadatum : descMetadata) { + HTML container = new HTML(); + container.addStyleName("metadataContent"); + descriptiveMetadataContainers.add(descMetadatum.getId()); + bundles.put(descMetadatum.getId(), descMetadatum); + } + } + + getDescriptiveMetadataHTML(aipId, descriptiveMetadataContainers, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (!AsyncCallbackUtils.treatCommonFailures(caught)) { + Toast.showError(messages.errorLoadingDescriptiveMetadata(caught.getMessage())); + } + } + + @Override + public void onSuccess(SafeHtml result) { + descriptiveMetadata.setHTML(result); + } + }); + + WCAGUtilities.getInstance().makeAccessible(descriptiveMetadata.getElement()); + } + + private void getDescriptiveMetadataHTML(final String aipId, final List metadataIds, + final AsyncCallback callback) { + try { + SafeUri uri = RestUtils.createDescriptiveMetadataHTMLUri(aipId, null); + RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, uri.asString()); + + requestBuilder.sendRequest(null, new RequestCallback() { + + @Override + public void onResponseReceived(Request request, Response response) { + if (200 == response.getStatusCode()) { + String html = response.getText(); + + SafeHtmlBuilder b = new SafeHtmlBuilder(); + b.append(SafeHtmlUtils.fromSafeConstant("
")); + b.append(SafeHtmlUtils.fromTrustedString(html)); + b.append(SafeHtmlUtils.fromSafeConstant("
")); + b.append(SafeHtmlUtils.fromSafeConstant("
")); + callback.onSuccess(b.toSafeHtml()); + } else { + String text = response.getText(); + String message; + try { + RestErrorOverlayType error = JsonUtils.safeEval(text); + message = error.getMessage(); + } catch (IllegalArgumentException e) { + message = text; + } + + SafeHtmlBuilder b = new SafeHtmlBuilder(); + + // error message + b.append(SafeHtmlUtils.fromSafeConstant("
")); + b.append(messages.descriptiveMetadataTransformToHTMLError()); + b.append(SafeHtmlUtils.fromSafeConstant("
"));
+            b.append(SafeHtmlUtils.fromString(message));
+            b.append(SafeHtmlUtils.fromSafeConstant("
")); + b.append(SafeHtmlUtils.fromSafeConstant("
")); + + callback.onSuccess(b.toSafeHtml()); + } + } + + @Override + public void onError(Request request, Throwable exception) { + callback.onFailure(exception); + } + }); + } catch (RequestException e) { + callback.onFailure(e); + } + } +} diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.ui.xml b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.ui.xml new file mode 100644 index 0000000000..3683a78ea4 --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/BrowseAIPPortal.ui.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/ContentPanelPortal.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/ContentPanelPortal.java new file mode 100644 index 0000000000..772f84efca --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/ContentPanelPortal.java @@ -0,0 +1,206 @@ +/** + * 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.portal; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.roda.core.data.v2.user.User; +import org.roda.wui.client.main.Login; +import org.roda.wui.client.main.Theme; +import org.roda.wui.client.common.UserLogin; +import org.roda.wui.client.common.dialogs.Dialogs; +import org.roda.wui.client.common.utils.AsyncCallbackUtils; +import org.roda.wui.client.common.utils.JavascriptUtils; +import org.roda.wui.client.welcome.Welcome; +import org.roda.wui.common.client.BadHistoryTokenException; +import org.roda.wui.common.client.HistoryResolver; +import org.roda.wui.common.client.tools.HistoryUtils; +import org.roda.wui.common.client.tools.StringUtils; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; + +import config.i18n.client.ClientMessages; + +public class ContentPanelPortal extends SimplePanel { + private static ContentPanelPortal instance = null; + + private static final Set resolvers = new HashSet<>(); + private static final ClientMessages messages = GWT.create(ClientMessages.class); + + private Widget currWidget; + private List lastHistoryTokens = null; + private HistoryResolver lastResolver = null; + + private ContentPanelPortal() { + super(); + this.addStyleName("contentPanel"); + this.currWidget = null; + } + + /** + * Get the singleton instance + * + * @return the singleton instance + */ + public static ContentPanelPortal getInstance() { + if (instance == null) { + instance = new ContentPanelPortal(); + } + return instance; + } + + public void init() { + // Login + resolvers.add(Login.RESOLVER); + // Theme static pages + resolvers.add(Theme.RESOLVER); + // Browse + resolvers.add(BrowseAIPPortal.RESOLVER); + // Search + resolvers.add(SearchPortal.RESOLVER); + // UUID resolver + resolvers.add(HistoryUtils.UUID_RESOLVER); + } + + /** + * Update the content panel with the new history + * + * @param historyTokens + * the history tokens + */ + public void update(final List historyTokens) { + HistoryResolver foundResolver = null; + for (final HistoryResolver resolver : resolvers) { + if (historyTokens.get(0).equals(resolver.getHistoryToken())) { + foundResolver = resolver; + break; + } + } + + if (foundResolver != null) { + update(historyTokens, foundResolver); + } else { + HistoryUtils.newHistory(Theme.RESOLVER, "Error404.html"); + } + } + + private void update(final List historyTokens, final HistoryResolver resolver) { + resolver.isCurrentUserPermitted(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + AsyncCallbackUtils.defaultFailureTreatment(caught); + } + + @Override + public void onSuccess(Boolean permitted) { + if (!permitted) { + UserLogin.getInstance().getAuthenticatedUser(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + UserLogin.getInstance().showSuggestLoginDialog(); + } + + @Override + public void onSuccess(User user) { + if (user.isGuest()) { + UserLogin.getInstance().showSuggestLoginDialog(); + } else { + Dialogs.showInformationDialog(messages.authorizationDeniedAlert(), + messages.authorizationDeniedAlertMessageExceptionSimple(""), messages.dialogOk(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + HistoryUtils.newHistory(Welcome.RESOLVER); + } + + @Override + public void onSuccess(Void result) { + HistoryUtils.newHistory(Welcome.RESOLVER); + } + }); + } + } + }); + } else { + resolver.resolve(HistoryUtils.tail(historyTokens), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof BadHistoryTokenException) { + HistoryUtils.newHistory(Theme.RESOLVER, "Error404.html"); + } else { + AsyncCallbackUtils.defaultFailureTreatment(caught); + } + } + + @Override + public void onSuccess(Widget widget) { + if (widget != null) { + if (widget != currWidget) { + currWidget = widget; + ContentPanelPortal.this.lastHistoryTokens = historyTokens; + ContentPanelPortal.this.lastResolver = resolver; + setWidget(widget); + JavascriptUtils.scrollToTop(); + } + setWindowTitle(historyTokens); + } + } + }); + } + } + }); + } + + private void setWindowTitle(List historyTokens) { + String tokenI18N = ""; + boolean resolved = false; + List tokens = historyTokens; + + while (!resolved && !tokens.isEmpty()) { + String token = StringUtils.join(tokens, "_"); + tokenI18N = messages.title(token).toUpperCase(); + + if (tokenI18N.isEmpty()) { + tokens = HistoryUtils.removeLast(tokens); + } else { + resolved = true; + } + + } + + if (!resolved) { + String lastToken = historyTokens.get(historyTokens.size() - 1); + + // TODO generalize suffix approach + if (lastToken.endsWith(".html")) { + lastToken = lastToken.substring(0, lastToken.length() - ".html".length()); + } + + // transform camel case to spaces + lastToken = lastToken.replaceAll("([A-Z])", " $1"); + + // upper-case + lastToken = lastToken.toUpperCase(); + tokenI18N = lastToken; + } + + // title.setText(tokenI18N); + Window.setTitle(messages.windowTitle(tokenI18N)); + } +} diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.java new file mode 100644 index 0000000000..c9439ec38b --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.java @@ -0,0 +1,122 @@ +/** + * 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.portal; + +import java.util.List; +import java.util.Map; + +import org.roda.core.data.common.RodaConstants; +import org.roda.wui.client.browse.BrowserService; +import org.roda.wui.client.common.resources.MyResources; +import org.roda.wui.client.common.utils.JavascriptUtils; +import org.roda.wui.client.main.GAnalyticsTracker; +import org.roda.wui.client.main.Theme; +import org.roda.wui.common.client.ClientLogger; +import org.roda.wui.common.client.tools.ConfigurationManager; +import org.roda.wui.common.client.tools.HistoryUtils; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NodeList; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.History; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.Widget; + +import config.i18n.client.ClientMessages; + +public class MainPortal extends Composite implements EntryPoint { + private ClientLogger logger = new ClientLogger(getClass().getName()); + private static final ClientMessages messages = GWT.create(ClientMessages.class); + + @Override + public void onModuleLoad() { + // Set uncaught exception handler + ClientLogger.setUncaughtExceptionHandler(); + + // load shared properties before init + BrowserService.Util.getInstance().retrieveSharedProperties(LocaleInfo.getCurrentLocale().getLocaleName(), + new AsyncCallback>>() { + @Override + public void onFailure(Throwable caught) { + logger.error("Failed loading initial data", caught); + } + + @Override + public void onSuccess(Map> sharedProperties) { + ConfigurationManager.initialize(sharedProperties); + init(); + } + }); + + } + + interface Binder extends UiBinder { + } + + @UiField(provided = true) + ContentPanelPortal contentPanel; + + /** + * Create a new main + */ + public MainPortal() { + contentPanel = ContentPanelPortal.getInstance(); + Binder uiBinder = GWT.create(Binder.class); + initWidget(uiBinder.createAndBindUi(this)); + } + + /** + * Initialize + */ + public void init() { + MyResources.INSTANCE.css().ensureInjected(); + + HistoryUtils.initEndpoint(true); + + // Remove loading image + RootPanel.getBodyElement().removeChild(DOM.getElementById("loading")); + NodeList bodyChilds = RootPanel.getBodyElement().getElementsByTagName("iframe"); + + for (int i = 0; i < bodyChilds.getLength(); i++) { + Element bodyChild = bodyChilds.getItem(i); + if (!bodyChild.hasAttribute("title")) { + bodyChild.setAttribute("title", "iframe_title"); + } + } + + // Add main widget to root panel + RootPanel.get().add(this); + RootPanel.get().addStyleName("roda"); + + // Initialize + contentPanel.init(); + onHistoryChanged(History.getToken()); + History.addValueChangeHandler(event -> onHistoryChanged(event.getValue())); + + if (ConfigurationManager.getBoolean(false, RodaConstants.UI_COOKIES_ACTIVE_PROPERTY)) { + JavascriptUtils.setCookieOptions(messages.cookiesMessage(), messages.cookiesDismisse(), + messages.cookiesLearnMore(), "#" + Theme.RESOLVER.getHistoryToken() + "/CookiesPolicy.html"); + } + } + + private void onHistoryChanged(String historyToken) { + List currentHistoryPath = HistoryUtils.getCurrentHistoryPath(); + contentPanel.update(currentHistoryPath); + GAnalyticsTracker.track(historyToken); + } +} diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.ui.xml b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.ui.xml new file mode 100644 index 0000000000..636ac6ddcd --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/MainPortal.ui.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.java new file mode 100644 index 0000000000..f1f45e2516 --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.java @@ -0,0 +1,82 @@ +/** + * 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.portal; + +import java.util.Arrays; +import java.util.List; + +import org.roda.wui.client.common.UserLogin; +import org.roda.wui.client.common.search.CatalogueSearch; +import org.roda.wui.common.client.HistoryResolver; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +public class SearchPortal extends Composite { + + public static final HistoryResolver RESOLVER = new HistoryResolver() { + + @Override + public void resolve(List historyTokens, AsyncCallback callback) { + if (historyTokens.size() > 1) { + SearchWithPreFiltersPortal.resolveToNewInstance(historyTokens, callback); + } else { + getInstance().resolve(callback); + } + } + + @Override + public void isCurrentUserPermitted(AsyncCallback callback) { + UserLogin.getInstance().checkRole(this, callback); + } + + @Override + public List getHistoryPath() { + return Arrays.asList(getHistoryToken()); + } + + @Override + public String getHistoryToken() { + return "search"; + } + }; + + private static SearchPortal instance = null; + + interface MyUiBinder extends UiBinder { + } + + private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + + @UiField(provided = true) + CatalogueSearch catalogueSearch; + + private SearchPortal() { + catalogueSearch = new CatalogueSearch(true, "Search_AIPs", "Search_representations", "Search_files", null, true, + false); + initWidget(uiBinder.createAndBindUi(this)); + } + + public static SearchPortal getInstance() { + if (instance == null) { + instance = new SearchPortal(); + } + return instance; + } + + public void resolve(AsyncCallback callback) { + callback.onSuccess(this); + } +} diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.ui.xml b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.ui.xml new file mode 100644 index 0000000000..e91d8fa4cd --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchPortal.ui.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.java new file mode 100644 index 0000000000..afd1062b4d --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.java @@ -0,0 +1,53 @@ +/** + * 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.portal; + +import java.util.List; + +import org.roda.wui.client.common.search.CatalogueSearch; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +public class SearchWithPreFiltersPortal extends Composite { + public static void resolveToNewInstance(List historyTokens, AsyncCallback callback) { + callback.onSuccess(getInstance(historyTokens)); + } + + interface MyUiBinder extends UiBinder { + } + + private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); + private static SearchWithPreFiltersPortal instance = null; + + private static SearchWithPreFiltersPortal getInstance(List historyTokens) { + if (instance == null || !historyTokens.equals(instance.historyTokens)) { + instance = new SearchWithPreFiltersPortal(historyTokens); + } + return instance; + } + + private final List historyTokens; + + @UiField(provided = true) + CatalogueSearch catalogueSearch; + + private SearchWithPreFiltersPortal(List historyTokens) { + this.historyTokens = historyTokens; + catalogueSearch = new CatalogueSearch(historyTokens, true, "Search_AIPs", "Search_representations", "Search_files", + null, false, true); + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.ui.xml b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.ui.xml new file mode 100644 index 0000000000..5aa0e27737 --- /dev/null +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/client/portal/SearchWithPreFiltersPortal.ui.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/ClientLoggerService.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/ClientLoggerService.java index 56a1dd59e9..13220c9179 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/ClientLoggerService.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/ClientLoggerService.java @@ -10,6 +10,7 @@ */ package org.roda.wui.common.client; +import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.LoggerException; import com.google.gwt.core.client.GWT; @@ -42,7 +43,7 @@ public static ClientLoggerServiceAsync getInstance() { ClientLoggerServiceAsync instance = (ClientLoggerServiceAsync) GWT.create(ClientLoggerService.class); ServiceDefTarget target = (ServiceDefTarget) instance; - target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI); + target.setServiceEntryPoint(GWT.getHostPageBaseURL() + RodaConstants.GWT_RPC_BASE_URL + SERVICE_URI); return instance; } } diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/HistoryUtils.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/HistoryUtils.java index e5c0f00716..99363bb9a4 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/HistoryUtils.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/HistoryUtils.java @@ -33,6 +33,7 @@ import org.roda.core.data.v2.risks.IndexedRisk; import org.roda.core.data.v2.risks.RiskIncidence; import org.roda.core.data.v2.user.RODAMember; +import org.roda.wui.client.portal.BrowseAIPPortal; import org.roda.wui.client.browse.BrowseDIP; import org.roda.wui.client.browse.BrowseFile; import org.roda.wui.client.browse.BrowseRepresentation; @@ -67,16 +68,21 @@ * @author Luis Faria */ public class HistoryUtils { - - private HistoryUtils() { - - } - public static final String HISTORY_SEP = "/"; public static final String HISTORY_SEP_REGEX = "/"; public static final String HISTORY_SEP_ESCAPE = "%2F"; public static final String HISTORY_PERMISSION_SEP = "."; + private static boolean USING_PORTAL_UI = false; + + public static void initEndpoint(boolean usingPortalUI) { + HistoryUtils.USING_PORTAL_UI = usingPortalUI; + } + + private HistoryUtils() { + // do nothing + } + public static List tail(List list) { return ListUtils.tail(list); } @@ -337,7 +343,11 @@ public static void resolve(T object, boolean replace) { if (object instanceof IndexedAIP) { IndexedAIP aip = (IndexedAIP) object; - path = HistoryUtils.getHistoryBrowse(aip.getId()); + if (USING_PORTAL_UI) { + path = getHistory(BrowseAIPPortal.RESOLVER, aip.getId()); + } else { + path = HistoryUtils.getHistoryBrowse(aip.getId()); + } } else if (object instanceof IndexedRepresentation) { IndexedRepresentation representation = (IndexedRepresentation) object; path = HistoryUtils.getHistoryBrowse(representation); diff --git a/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/RestUtils.java b/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/RestUtils.java index c6de0b3dbc..bf860de6c2 100644 --- a/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/RestUtils.java +++ b/roda-ui/roda-wui/src/main/java/org/roda/wui/common/client/tools/RestUtils.java @@ -187,7 +187,12 @@ public static SafeUri createDescriptiveMetadataHTMLUri(String aipId, String desc StringBuilder b = new StringBuilder(); // base uri b.append(RodaConstants.API_REST_V1_AIPS).append(URL.encodeQueryString(aipId)).append(RodaConstants.API_SEP) - .append(RodaConstants.API_DESCRIPTIVE_METADATA).append(RodaConstants.API_SEP).append(descId); + .append(RodaConstants.API_DESCRIPTIVE_METADATA); + + if (descId != null) { + b.append(RodaConstants.API_SEP).append(descId); + } + // accept format attribute b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT) .append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_HTML); diff --git a/roda-ui/roda-wui/src/main/resources/config/i18n/ServerMessages.properties b/roda-ui/roda-wui/src/main/resources/config/i18n/ServerMessages.properties index df3289cc99..084a350dd5 100644 --- a/roda-ui/roda-wui/src/main/resources/config/i18n/ServerMessages.properties +++ b/roda-ui/roda-wui/src/main/resources/config/i18n/ServerMessages.properties @@ -591,3 +591,5 @@ email.recoverlogin.from = RODA Admin ########################################## lists.label.BrowseAIP_aipChildren.single: sublevel lists.label.BrowseAIP_aipChildren.multiple: sublevels +lists.label.BrowseAIPPortal_aipChildren.single: sublevel +lists.label.BrowseAIPPortal_aipChildren.multiple: sublevels diff --git a/roda-ui/roda-wui/src/main/resources/config/roda-wui.properties b/roda-ui/roda-wui/src/main/resources/config/roda-wui.properties index b43bd72fdd..2548ac6c43 100644 --- a/roda-ui/roda-wui/src/main/resources/config/roda-wui.properties +++ b/roda-ui/roda-wui/src/main/resources/config/roda-wui.properties @@ -812,6 +812,7 @@ ui.lists.Search_AIPs.search.advanced.enabled = true ui.lists.Search_files.search.advanced.enabled = true ui.lists.Search_representations.search.advanced.enabled = true ui.lists.UserLog_logEntries.search.advanced.enabled = true +ui.lists.BrowseAIPPortal_aipChildren.search.advanced.enabled = true ########################################################################## # List configuration @@ -829,6 +830,7 @@ ui.lists.BrowseRepresentation_disseminations.search.selectedInfo.alwaysVisible = ui.lists.RepresentationInformationAssociations_RI.search.selectedInfo.alwaysVisible = true ui.lists.RepresentationInformationNetwork_RI.search.selectedInfo.alwaysVisible = true ui.lists.RiskShowPanel_riskIncidences.search.selectedInfo.alwaysVisible = true +ui.lists.BrowseAIPPortal_aipChildren.search.selectedInfo.alwaysVisible = true ########################################################################## # List configuration @@ -1032,6 +1034,7 @@ ui.lists.UserLog_logEntries.facets.parameters.instanceId.sort = COUNT # Default: value of property `ui.icons.class.{class.simpleName}` ########################################################################## ui.lists.BrowseAIP_aipChildren.search.selectedInfo.icon = fa fa-sitemap +ui.lists.BrowseAIPPortal_aipChildren.search.selectedInfo.icon = fa fa-sitemap ########################################################################## # List configuration @@ -1042,6 +1045,7 @@ ui.lists.BrowseAIP_aipChildren.search.selectedInfo.icon = fa fa-sitemap # ########################################################################## ui.lists.BrowseAIP_aipChildren.search.selectedInfo.label.selected.i18n.single = lists.label.BrowseAIP_aipChildren.single +ui.lists.BrowseAIPPortal_aipChildren.search.selectedInfo.label.selected.i18n.single = lists.label.BrowseAIPPortal_aipChildren.single ########################################################################## # List configuration @@ -1051,6 +1055,7 @@ ui.lists.BrowseAIP_aipChildren.search.selectedInfo.label.selected.i18n.single = # Default: "someOf" i18n of class ########################################################################## ui.lists.BrowseAIP_aipChildren.search.selectedInfo.label.selected.i18n.multiple = lists.label.BrowseAIP_aipChildren.multiple +ui.lists.BrowseAIPPortal_aipChildren.search.selectedInfo.label.selected.i18n.multiple = lists.label.BrowseAIPPortal_aipChildren.multiple ########################################################################## # List configuration @@ -1061,6 +1066,7 @@ ui.lists.BrowseAIP_aipChildren.search.selectedInfo.label.selected.i18n.multiple # Default: "someOf" i18n of class ########################################################################## ui.lists.BrowseAIP_aipChildren.search.selectedInfo.label.default.i18n = lists.label.BrowseAIP_aipChildren.multiple +ui.lists.BrowseAIPPortal_aipChildren.search.selectedInfo.label.default.i18n = lists.label.BrowseAIPPortal_aipChildren.multiple ########################################################################## # File viewers settings diff --git a/roda-ui/roda-wui/src/main/resources/config/theme/PreChildrenPortal.html b/roda-ui/roda-wui/src/main/resources/config/theme/PreChildrenPortal.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/roda-ui/roda-wui/src/main/resources/config/theme/PreDisseminationsPortal.html b/roda-ui/roda-wui/src/main/resources/config/theme/PreDisseminationsPortal.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/roda-ui/roda-wui/src/main/resources/config/theme/PreMetadataPortal.html b/roda-ui/roda-wui/src/main/resources/config/theme/PreMetadataPortal.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/roda-ui/roda-wui/src/main/webapp/Portal.html b/roda-ui/roda-wui/src/main/webapp/Portal.html new file mode 100644 index 0000000000..2150d9b441 --- /dev/null +++ b/roda-ui/roda-wui/src/main/webapp/Portal.html @@ -0,0 +1,97 @@ + + + + +RODA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + + + + + + diff --git a/roda-ui/roda-wui/src/main/webapp/WEB-INF/web.xml b/roda-ui/roda-wui/src/main/webapp/WEB-INF/web.xml index c32f4ed2b9..3f7b120577 100644 --- a/roda-ui/roda-wui/src/main/webapp/WEB-INF/web.xml +++ b/roda-ui/roda-wui/src/main/webapp/WEB-INF/web.xml @@ -275,19 +275,19 @@ ClientLogger - /org.roda.wui.RodaWUI/wuilogger + /gwtrpc/wuilogger UserManagementService - /org.roda.wui.RodaWUI/UserManagementService + /gwtrpc/UserManagementService UserLoginService - /org.roda.wui.RodaWUI/userlogin + /gwtrpc/userlogin BrowserService - /org.roda.wui.RodaWUI/browserservice + /gwtrpc/browserservice