diff --git a/mobile-configuration/pom.xml b/mobile-configuration/pom.xml index 839a4a162..4b56b0924 100644 --- a/mobile-configuration/pom.xml +++ b/mobile-configuration/pom.xml @@ -23,7 +23,7 @@ --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.silverpeas.components</groupId> @@ -31,6 +31,11 @@ <version>6.4-SNAPSHOT</version> </parent> + <properties> + <timestamp>${maven.build.timestamp}</timestamp> + <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format> + </properties> + <groupId>org.silverpeas.components.mobile</groupId> <artifactId>silverpeas-mobile-configuration</artifactId> <packaging>jar</packaging> @@ -40,8 +45,17 @@ <resources> <resource> <directory>src/main/config</directory> + <filtering>true</filtering> </resource> </resources> + + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + </plugin> + </plugins> + </build> </project> diff --git a/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties b/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties index 645652fd9..f061b3c17 100644 --- a/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties +++ b/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties @@ -1,6 +1,12 @@ +version=${project.version} +build.date=${timestamp} + # css skin file url styleSheet= +# css for wysiwyg contents +wysiwyg.styleSheet= + # icons app apple-touch-icon=touch-icon-iphone.png apple-touch-icon72x72=touch-icon-iphone.png @@ -17,6 +23,12 @@ log.module.name=silverpeas.components.mobile # true if tablets must use mobile GUI. false if tablets must use standard GUI. guiMobileForTablets=true +# Display information about cookies data storage +displayCookiesInformation=true + +# How often a user should accept cookies +displayCookiesInformationFrequency=90 + # Default users domain selected on login page defaultDomainId=0 @@ -25,6 +37,8 @@ defaultDomainId=0 homepage.lastpublications=true # display upcomming events or not on main home page homepage.lastevents=true +# display lasts news or not on main home page +homepage.lastnews=true # display free zone on main home page homepage.freezone=true # display free zone thin on main home page @@ -33,6 +47,10 @@ homepage.freezonethin=true spacehomepage.lastpublications=true # display last events or not on spaces home page spacehomepage.lastevents=true +# display last news or not on spaces home page +spacehomepage.lastnews=true + +spacehomepage.displayUrlType=true # home page zones order homepage.zone.changeorder=false @@ -86,7 +104,7 @@ directory.display.tab.default=allcontacts avatar.updatable=true # size of users avatars -avatar.size=24x +avatar.size=32x # size of user avatar in main menu big.avatar.size=40x @@ -120,6 +138,7 @@ push.notification.clientConfig= # json configuration for pwa add to home screen manifest.json.path= +web-app-origin-association.json.path= #footer custom buttons #customButtonUrl1= @@ -132,4 +151,7 @@ nocache=false form.htmllayer.display=false # maintain http session (store ids in local storage) -maintain.session=true \ No newline at end of file +maintain.session=true + +# speaking configuration +speaking=true \ No newline at end of file diff --git a/mobile-war/pom.xml b/mobile-war/pom.xml index c03b6410b..c756f169c 100644 --- a/mobile-war/pom.xml +++ b/mobile-war/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>org.silverpeas.components</groupId> <artifactId>mobile</artifactId> - <version>6.4-SNAPSHOT</version> + <version>6.4-JR-SNAPSHOT</version> </parent> <groupId>org.silverpeas.components.mobile</groupId> @@ -396,7 +396,7 @@ <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> - <version>1.4</version> + <version>1.5</version> </dependency> </dependencies> diff --git a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java index 5a7232db8..65bb4b9a2 100644 --- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java +++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java @@ -39,8 +39,8 @@ import org.silverpeas.core.security.token.TokenGenerator; import org.silverpeas.core.security.token.TokenGeneratorProvider; import org.silverpeas.core.security.token.synchronizer.SynchronizerToken; -import org.silverpeas.core.util.ResourceLocator; -import org.silverpeas.core.util.SettingBundle; +import org.silverpeas.kernel.bundle.ResourceLocator; +import org.silverpeas.kernel.bundle.SettingBundle; import org.silverpeas.core.util.URLUtil; import org.silverpeas.core.web.mvc.controller.MainSessionController; @@ -52,7 +52,6 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -72,40 +71,47 @@ public void destroy() { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { - String url = ((HttpServletRequest) req).getRequestURL().toString(); + final HttpServletRequest request = (HttpServletRequest) req; + final HttpServletResponse response = (HttpServletResponse) res; + String url = request.getRequestURL().toString(); if (url.contains("spmobile") && res != null) { - String csp = ((HttpServletResponse) res).getHeader("Content-Security-Policy"); + String csp = response.getHeader("Content-Security-Policy"); if (csp != null && !csp.contains("img-src")) { csp += "; img-src * data: blob:;"; - ((HttpServletResponse) res).setHeader("Content-Security-Policy", csp); + response.setHeader("Content-Security-Policy", csp); } } - Boolean mob = (Boolean) ((HttpServletRequest) req).getSession().getAttribute("isMobile"); - if (mob != null && !mob) { + // the session could not exist + final SafeSessionManager session = new SafeSessionManager(request); + + final Boolean mobileAlreadyDetected = session.getAttribute("isMobile", Boolean.class); + if (mobileAlreadyDetected != null && !mobileAlreadyDetected) { chain.doFilter(req, res); return; } - String userAgent = ((HttpServletRequest) req).getHeader("User-Agent"); + final String userAgent = request.getHeader("User-Agent"); if (userAgent != null) { - boolean isMobile = userAgent.contains("Android") || userAgent.contains("iPhone"); - ((HttpServletRequest) req).getSession().setAttribute("isMobile", Boolean.valueOf(isMobile)); + final boolean isMobile = Boolean.TRUE.equals(mobileAlreadyDetected) + || userAgent.contains("Android") + || userAgent.contains("iPhone"); + session.setAttribute("isMobile", isMobile); - Boolean tablet = (Boolean) ((HttpServletRequest) req).getSession().getAttribute("tablet"); - if (tablet == null) { - tablet = Boolean.valueOf(false); - } + final boolean tablet = session.getAttribute("tablet", Boolean.class, false); boolean redirect = isRedirect(url); - if (isMobile && !url.contains("sso") && !url.contains("services") && - !url.contains("spmobile") && !url.contains(URLUtil.getApplicationURL() + "/chat/") && - !url.contains(URLUtil.getApplicationURL() + "/visio/") && - !url.contains(URLUtil.getApplicationURL() + "/util/") && (!tablet) && - !url.contains("attached_file") && !url.contains("Ticket") && - !url.contains("LinkFile/Key") && redirect) { + !url.contains("spmobile") && !url.contains(URLUtil.getApplicationURL() + "/chat/") && + !url.contains(URLUtil.getApplicationURL() + "/media/") && + !url.contains(URLUtil.getApplicationURL() + "/visio/") && + !url.contains(URLUtil.getApplicationURL() + "/util/") && (!tablet) && + !url.contains("attached_file") && !url.contains("Ticket") && + !url.contains("LinkFile/Key") && + !url.contains("Logout") && + !url.contains("FileServer/vignette") && + !url.contains("FileServer/thumbnail") && redirect) { String params = ""; if (url.contains("Publication")) { String id = url.substring(url.lastIndexOf("/") + 1); @@ -113,6 +119,15 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) String appId = pub.getInstanceId(); params = "?shortcutContentType=Publication&shortcutContentId=" + id + "&shortcutAppId=" + appId; + } else if (url.contains("/File/")) { + String id = url.substring(url.lastIndexOf("/") + 1); + String l = request.getParameter("ContentLanguage"); + params = "?shortcutContentType=Attachment&shortcutContentId=" + id + "&shortcutRole=" + l; + } else if (url.contains("/Topic/")) { + // sample : /silverpeas/Topic/6278?ComponentId=kmelia2431 + String id = url.substring(url.lastIndexOf("/")+1); + String appId = ((HttpServletRequest) req).getParameter("ComponentId"); + params = "?shortcutContentType=Folder&shortcutContentId=" + id + "&shortcutAppId=" + appId; } else if (url.contains("Form")) { // sample : /silverpeas/Form/1?ComponentId=formsOnline1 String id = url.substring(url.lastIndexOf("/") + 1); @@ -174,9 +189,15 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) } else if (url.contains("Contribution")) { String contributionId = url.substring(url.lastIndexOf("/") + 1); params = "?shortcutContentType=Event&shortcutContributionId=" + contributionId; + } else if (url.contains("Space")) { + String spaceId = url.substring(url.lastIndexOf("/") + 1); + params = "?shortcutContentType=Space&shortcutAppId=" + spaceId; } else if (url.contains("Component")) { String appId = url.substring(url.lastIndexOf("/") + 1); params = "?shortcutContentType=Component&shortcutAppId=" + appId; + } else if (url.contains("/needSession")) { + String appId = url.replaceAll("/needSession",""); + params = "?shortcutContentType=Url&shortcutAppId=" + appId; } else if (!url.contains("AuthenticationServlet") && (url.endsWith("silverpeas") || url.endsWith("silverpeas/") || url.contains("/silverpeas/"))) { @@ -187,10 +208,9 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) return; } - HttpSession session = ((HttpServletRequest) req).getSession(false); - SynchronizerToken token = (SynchronizerToken) session.getAttribute(SESSION_TOKEN_KEY); - MainSessionController controller = (MainSessionController) session.getAttribute( - MainSessionController.MAIN_SESSION_CONTROLLER_ATT); + SynchronizerToken token = session.getAttribute(SESSION_TOKEN_KEY, SynchronizerToken.class); + MainSessionController controller = session.getAttribute( + MainSessionController.MAIN_SESSION_CONTROLLER_ATT, MainSessionController.class); if (controller != null && token == null) { //logger.warn("security.web.protection.token is disable"); // generate fake token for auto login without token security @@ -200,26 +220,18 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) session.setAttribute(SESSION_TOKEN_KEY, token); } - if (session.getAttribute(SESSION_PARAMS_KEY) != null && params.isEmpty()) { - params = (String) session.getAttribute(SESSION_PARAMS_KEY); - session.removeAttribute(SESSION_PARAMS_KEY); + if (session.getAttribute(SESSION_PARAMS_KEY, String.class) != null && params.isEmpty()) { + params = session.removeAttribute(SESSION_PARAMS_KEY, String.class); } String aDestinationPage = "/silverpeas/spmobile/spmobil.jsp" + params; session.setAttribute(SESSION_PARAMS_KEY, params); - String urlWithSessionID = - ((HttpServletResponse) res).encodeRedirectURL(aDestinationPage.toString()); - ((HttpServletResponse) res).sendRedirect(urlWithSessionID); - return; - - } else { - chain.doFilter(req, res); + String urlWithSessionID = response.encodeRedirectURL(aDestinationPage); + response.sendRedirect(urlWithSessionID); return; } - } else { - chain.doFilter(req, res); - return; } + chain.doFilter(req, res); } private String extractSurveyParameters(final ServletRequest req) { diff --git a/mobile-war/src/main/java/org/silverpeas/bridge/SafeSessionManager.java b/mobile-war/src/main/java/org/silverpeas/bridge/SafeSessionManager.java new file mode 100644 index 000000000..2792a13fb --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/bridge/SafeSessionManager.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2000 - 2023 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.bridge; + +import javax.servlet.http.HttpServletRequest; + +import static java.util.Optional.ofNullable; + +/** + * This class allows handling a session safely against the different request calls. + * <p> + * Some synchronized access are performed around session creation and session attribute accesses. + * </p> + * @author silveryocha + */ +public class SafeSessionManager { + private static final Object MUTEX = new Object(); + + private final HttpServletRequest request; + + public SafeSessionManager(final HttpServletRequest request) { + this.request = request; + } + + /** + * Gets the specified attribute value from the session. + * <p> + * If the session does not exists, it is not created. + * </p> + * <p> + * If no value exists, null is returned. + * </p> + * @param attributeName the name of the attribute to fetch. + * @param aClass the class of the value fetched. + * @return the value if any, null otherwise. + * @param <T> the type of the value. + */ + public <T> T getAttribute(final String attributeName, final Class<T> aClass) { + return getAttribute(attributeName, aClass, null); + } + + /** + * Gets the specified attribute value from the session. + * <p> + * If the session does not exists, it is not created. + * </p> + * <p> + * If no value exists, default one is returned. + * </p> + * @param attributeName the name of the attribute to fetch. + * @param aClass the class of the value fetched. + * @param defaultValue default value of no value fetched from session. + * @return the value if any, default value otherwise. + * @param <T> the type of the value. + */ + public <T> T getAttribute(final String attributeName, final Class<T> aClass, + final T defaultValue) { + synchronized (MUTEX) { + return ofNullable(request.getSession(false)) + .map(s -> s.getAttribute(attributeName)) + .map(aClass::cast) + .orElse(defaultValue); + } + } + + /** + * Sets the specified attribute value into the session. + * <p> + * If the session does not exist, it is created. + * </p> + * @param attributeName the name of the attribute to fetch. + * @param value the value to put. + * @param <T> the type of the value. + */ + public <T> void setAttribute(final String attributeName, final T value) { + synchronized (MUTEX) { + request.getSession().setAttribute(attributeName, value); + } + } + + /** + * Removes from the session the specified attribute. + * <p> + * If the session does not exist, nothing is performed. + * </p> + * @param attributeName the name of the attribute to fetch. + * @param aClass the class of the value fetched. + * @return the removed value if any, null otherwise. + * @param <T> the type of the value. + */ + public <T> T removeAttribute(final String attributeName, final Class<T> aClass) { + synchronized (MUTEX) { + final T value = getAttribute(attributeName, aClass); + ofNullable(request.getSession(false)) + .ifPresent(s -> s.removeAttribute(attributeName)); + return value; + } + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java index 93283e058..a480e82a5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java @@ -74,14 +74,17 @@ import org.silverpeas.mobile.client.common.event.authentication.AuthenticationEventHandler; import org.silverpeas.mobile.client.common.mobil.MobilUtils; import org.silverpeas.mobile.client.common.mobil.Orientation; +import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.common.navigation.PageHistory; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; import org.silverpeas.mobile.client.common.network.NetworkHelper; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.common.storage.CacheStorageHelper; import org.silverpeas.mobile.client.common.storage.LocalStorageHelper; import org.silverpeas.mobile.client.components.base.Page; import org.silverpeas.mobile.client.components.base.events.window.OrientationChangeEvent; import org.silverpeas.mobile.client.pages.connexion.ConnexionPage; +import org.silverpeas.mobile.client.pages.cookies.CookiesPage; import org.silverpeas.mobile.client.pages.main.HomePage; import org.silverpeas.mobile.client.pages.search.SearchResultPage; import org.silverpeas.mobile.client.pages.termsofservice.TermsOfServicePage; @@ -94,6 +97,7 @@ import org.silverpeas.mobile.shared.dto.authentication.UserProfileDTO; import org.silverpeas.mobile.shared.dto.configuration.Config; import org.silverpeas.mobile.shared.dto.configuration.IConfig; +import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.search.ResultDTO; import org.silverpeas.mobile.shared.exceptions.AuthenticationException; @@ -135,6 +139,7 @@ public static UserProfileDTO getUserProfile() { public static void setUser(final DetailUserDTO user) { SpMobil.user = user; + displayPersonnalApps(); } @@ -142,9 +147,15 @@ public static void setUser(final DetailUserDTO user) { * Init. spmobile. */ public void onModuleLoad() { + exportNativeFunctions(); + checkVersion(); + // init connexion supervision NetworkHelper.getInstance(); + setFontSize(getConfiguration().getFontSize()); + setFilter(getConfiguration()); + instance = this; shortcutAppId = Window.Location.getParameter("shortcutAppId"); shortcutContentType = Window.Location.getParameter("shortcutContentType"); @@ -177,7 +188,9 @@ public void onModuleLoad() { EventBus.getInstance().addHandler(ExceptionEvent.TYPE, new ErrorManager()); EventBus.getInstance().addHandler(AbstractAuthenticationErrorEvent.TYPE, this); - loadIds(null); + SSO = !ResourcesManager.getSSOPath().isEmpty(); + + displayFirstPage(); NodeList<Element> tags = Document.get().getElementsByTagName("meta"); for (int i = 0; i < tags.getLength(); i++) { @@ -222,6 +235,27 @@ public void onResize(final ResizeEvent resizeEvent) { apps.add(new ResourcesManagerApp()); } + private static void checkVersion() { + String buildDate = ResourcesManager.getParam("build.date"); + String lastBuild = LocalStorageHelper.getInstance().load("build.date"); + if (lastBuild != null && !buildDate.equals(lastBuild)) { + // clear cache + AuthentificationManager.getInstance().clearCache(); + } + if (lastBuild == null || lastBuild.isEmpty()) LocalStorageHelper.getInstance().storeBuildDate(); + } + + public void displayFirstPage() { + checkVersion(); + boolean displayCookiesInformation = Boolean.parseBoolean(ResourcesManager.getParam("displayCookiesInformation")); + String cookie = Cookies.getCookie("accept_cookies"); + if (displayCookiesInformation && (cookie == null || cookie.isEmpty())) { + displayCookiesPage(); + } else { + loadIds(null); + } + } + public static Page getMainPage() { if (mainPage == null) { mainPage = new Page(); @@ -256,7 +290,7 @@ private static void login(final FullUserDTO user, final String password, Command } public static void displayMainPage() { - + SpMobil.getMainPage().showFooter(); if (!Window.Location.getHref().contains("?locale=") && !user.getLanguage().equalsIgnoreCase("fr")) { Window.Location.replace(Window.Location.getHref() + "?locale=" + user.getLanguage()); @@ -264,20 +298,24 @@ public static void displayMainPage() { getMainPage().setUser(user); RootPanel.get().clear(); RootPanel.get().add(getMainPage()); + PageHistory.getInstance().clear(); PageHistory.getInstance().goTo(new HomePage()); - if ((shortcutAppId != null && shortcutContentType != null && shortcutContentId != null) || - shortcutContributionId != null || - (shortcutContentType != null && shortcutContentType.equals("Component") && - shortcutAppId != null)) { + if ((shortcutContentType != null && shortcutContentId != null) || + (shortcutAppId != null && shortcutContentType != null && shortcutContentId != null) || + shortcutContributionId != null || + (shortcutContentType != null && (shortcutContentType.equals("Component") || + shortcutContentType.equals("Space")) && shortcutAppId != null)) { ShortCutRouter.route(user, shortcutAppId, shortcutContentType, shortcutContentId, shortcutContributionId, shortcutRole); + } else if (shortcutContentType != null && shortcutContentType.equalsIgnoreCase("Url") && shortcutAppId != null) { + LinksManager.openIframePage(shortcutAppId); } else { MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<HomePageDTO>() { @Override public void attempt() { - ServicesLocator.getServiceNavigation().getHomePageData(null, this); + ServicesLocator.getServiceNavigation().getHomePageData(null, SpMobil.getContentZoomLevel(), this); } @Override @@ -296,10 +334,33 @@ public void onSuccess(final Method method, final HomePageDTO result) { } } + private static void displayPersonnalApps () { + if (getUser() != null && !getMainPage().isPersonalAppsInitialized()) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<List<ApplicationInstanceDTO>>() { + @Override + public void attempt() { + ServicesLocator.getServiceNavigation().getPersonnalSpaceContent(getUser().getId(), this); + } + + @Override + public void onSuccess(Method method, List<ApplicationInstanceDTO> applicationInstanceDTOS) { + getMainPage().setPersonalApps(applicationInstanceDTOS); + } + }; + action.attempt(); + } + } + public static void displayTermsOfServicePage() { RootPanel.get().clear(); RootPanel.get().add(getMainPage()); - SpMobil.getMainPage().setContent(new TermsOfServicePage()); + SpMobil.getMainPage().setContent(new TermsOfServicePage(), true); + } + + public static void displayCookiesPage() { + RootPanel.get().clear(); + RootPanel.get().add(getMainPage()); + SpMobil.getMainPage().setContent(new CookiesPage(), true); } /** @@ -334,7 +395,7 @@ public void onSuccess(final Method method, final DetailUserDTO detailUserDTO) { super.onSuccess(method, detailUserDTO); setUser(detailUserDTO); setUserProfile(UserProfileDTO.getBean( - LocalStorageHelper.load(AuthentificationManager.USER_PROFIL, IUserProfile.class))); + LocalStorageHelper.getInstance().load(AuthentificationManager.USER_PROFIL, IUserProfile.class))); if (getUserProfile() == null) { UserProfileDTO p = new UserProfileDTO(); p.setFullName(detailUserDTO.getFirstName() + " " + detailUserDTO.getLastName()); @@ -370,7 +431,7 @@ public void onFailure(final Method method, final Throwable t) { tryToRelogin(attempt); } }; - SSO = true; + action.setRelogin(false); action.attempt(); } else { //Login @@ -384,6 +445,7 @@ public static boolean isSSO() { } private void tryToRelogin(final Command attempt) { + checkVersion(); FullUserDTO user = AuthentificationManager.getInstance().loadUser(); if (user != null) { String password = AuthentificationManager.getInstance().decryptPassword(user.getPassword()); @@ -443,9 +505,11 @@ public void onSuccess(final Method method, final Boolean desktopMode) { } public static void displayLoginPage(AuthenticationException error) { + checkVersion(); ConnexionPage connexionPage = new ConnexionPage(); connexionPage.setAuthenticateError(error); RootPanel.get().clear(); + PageHistory.getInstance().clear(); RootPanel.get().add(connexionPage); } @@ -518,7 +582,7 @@ public static void destroyMainPage() { } public static Config getConfiguration() { - AutoBean<IConfig> conf = LocalStorageHelper.load("config", IConfig.class); + AutoBean<IConfig> conf = LocalStorageHelper.getInstance().load("config", IConfig.class); Config config = null; if (conf == null) { config = Config.getDefaultConfig(); @@ -529,8 +593,34 @@ public static Config getConfiguration() { return config; } + public static String getContentZoomLevel() { + double z = getConfiguration().getFontSize() / 10d; + return String.valueOf(z); + } + @Override public void onAuthenticationError(final AbstractAuthenticationErrorEvent event) { displayLoginPage(((AuthenticationException) event.getException())); } + + public static native void exportNativeFunctions()/*-{ + $wnd.navigateTo = $entry(@org.silverpeas.mobile.client.common.navigation.LinksManager::navigateToPermalink(*)); + }-*/; + + public static void setFontSize(int value) { + Document.get().getBody().setAttribute("style", "font-size:"+value+"pt;"); + } + + public static void setFilter(Config configuration) { + if (configuration.isStandard()) { + Document.get().getElementsByTagName("html").getItem(0).setAttribute("style",""); + } else if (configuration.isGrayscale()) { + Document.get().getElementsByTagName("html").getItem(0).setAttribute("style","filter:grayscale(1);"); + } else if (configuration.isSepia()) { + Document.get().getElementsByTagName("html").getItem(0).setAttribute("style","filter:sepia(1);"); + } else if (configuration.isInverse()) { + Document.get().getElementsByTagName("html").getItem(0).setAttribute("style","filter:invert(1);"); + } + } + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/AgendaApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/AgendaApp.java index fbbe8239e..27709beec 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/AgendaApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/AgendaApp.java @@ -26,28 +26,12 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.DateTimeFormat; -import com.google.gwt.user.client.Window; import com.google.gwt.user.datepicker.client.CalendarUtil; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.agenda.events.TimeRange; -import org.silverpeas.mobile.client.apps.agenda.events.app.AbstractAgendaAppEvent; -import org.silverpeas.mobile.client.apps.agenda.events.app.AgendaAppEventHandler; -import org.silverpeas.mobile.client.apps.agenda.events.app.AttachmentsLoadEvent; -import org.silverpeas.mobile.client.apps.agenda.events.app.CalendarLoadEvent; -import org.silverpeas.mobile.client.apps.agenda.events.app.ParticipationEvent; -import org.silverpeas.mobile.client.apps.agenda.events.app.ReminderCreateEvent; -import org.silverpeas.mobile.client.apps.agenda.events.app.ReminderDeleteEvent; -import org.silverpeas.mobile.client.apps.agenda.events.app.ReminderUpdateEvent; -import org.silverpeas.mobile.client.apps.agenda.events.app.RemindersLoadEvent; -import org.silverpeas.mobile.client.apps.agenda.events.pages.AbstractAgendaPagesEvent; -import org.silverpeas.mobile.client.apps.agenda.events.pages.AgendaPagesEventHandler; -import org.silverpeas.mobile.client.apps.agenda.events.pages.AttachmentsLoadedEvent; -import org.silverpeas.mobile.client.apps.agenda.events.pages.CalendarLoadedEvent; -import org.silverpeas.mobile.client.apps.agenda.events.pages.ParticipationUpdatedEvent; -import org.silverpeas.mobile.client.apps.agenda.events.pages.ReminderAddedEvent; -import org.silverpeas.mobile.client.apps.agenda.events.pages.ReminderDeletedEvent; -import org.silverpeas.mobile.client.apps.agenda.events.pages.RemindersLoadedEvent; +import org.silverpeas.mobile.client.apps.agenda.events.app.*; +import org.silverpeas.mobile.client.apps.agenda.events.pages.*; import org.silverpeas.mobile.client.apps.agenda.pages.AgendaPage; import org.silverpeas.mobile.client.apps.agenda.pages.EventPage; import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages; @@ -60,7 +44,9 @@ import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; +import org.silverpeas.mobile.shared.dto.BaseDTO; import org.silverpeas.mobile.shared.dto.ContentsTypes; +import org.silverpeas.mobile.shared.dto.UserDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventAttendeeDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; @@ -140,6 +126,7 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { AgendaPage page = new AgendaPage(); page.setPageTitle(event.getInstance().getLabel()); + loadUsersAndGroups(page); MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<List<CalendarDTO>>() { @Override @@ -438,6 +425,24 @@ public void attempt() { action.attempt(); } + @Override + public void createEvent(EventCreateEvent event) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<CalendarEventDTO>() { + @Override + public void attempt() { + super.attempt(); + ServicesLocator.getServiceAlmanach().createEvent(getApplicationInstance().getId(), event.getEvent().getCalendar().getId(), event.getEvent(), this); + } + + @Override + public void onSuccess(Method method, CalendarEventDTO event) { + super.onSuccess(method, event); + EventBus.getInstance().fireEvent(new EventSavedEvent()); + } + }; + action.attempt(); + } + private CalendarEventAttendeeDTO getUserAttendee(final List<CalendarEventAttendeeDTO> attendees) { CalendarEventAttendeeDTO attendee = null; for (CalendarEventAttendeeDTO attendeeDTO : attendees) { @@ -448,5 +453,33 @@ private CalendarEventAttendeeDTO getUserAttendee(final List<CalendarEventAttende } return attendee; } + + public void loadUsersAndGroups(AgendaPage page) { + + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<List<BaseDTO>>() { + @Override + public void attempt() { + super.attempt(); + String appId = getApplicationInstance().getId(); + if (getApplicationInstance().getPersonnal()) appId = null; + ServicesLocator.getServiceNotifications() + .getAllowedUsersAndGroups(appId, null, this); + } + + @Override + public void onSuccess(final Method method, final List<BaseDTO> baseDTOS) { + super.onSuccess(method, baseDTOS); + List<BaseDTO> users = new ArrayList<>(); + for (BaseDTO dto : baseDTOS) { + if (dto instanceof UserDTO) { + users.add(dto); + } + } + page.setAllowedUsersAndGroups(users); + } + }; + action.attempt(); + } + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/AgendaAppEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/AgendaAppEventHandler.java index db193ad9c..88638ee05 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/AgendaAppEventHandler.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/AgendaAppEventHandler.java @@ -37,4 +37,6 @@ public interface AgendaAppEventHandler extends EventHandler{ void loadAttachments(AttachmentsLoadEvent event); void participation(ParticipationEvent participationEvent); + + void createEvent(EventCreateEvent event); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/EventCreateEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/EventCreateEvent.java new file mode 100644 index 000000000..23e0817f4 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/EventCreateEvent.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.agenda.events.app; + +import org.silverpeas.mobile.shared.dto.almanach.CalendarEventCreationDTO; +import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; +import org.silverpeas.mobile.shared.dto.reminder.ReminderDTO; + +public class EventCreateEvent extends AbstractAgendaAppEvent { + private CalendarEventCreationDTO event; + + public EventCreateEvent(CalendarEventCreationDTO event) { + super(); + this.event = event; + } + + @Override + protected void dispatch(AgendaAppEventHandler handler) { + handler.createEvent(this); + } + + + public CalendarEventCreationDTO getEvent() { + return event; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsResources.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/AbstractEditEventPagesEvent.java similarity index 66% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsResources.java rename to mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/AbstractEditEventPagesEvent.java index c3e7f7493..0157c4b01 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsResources.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/AbstractEditEventPagesEvent.java @@ -22,31 +22,23 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package org.silverpeas.mobile.client.apps.documents.resources; +package org.silverpeas.mobile.client.apps.agenda.events.pages; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.event.shared.GwtEvent; -public interface DocumentsResources extends ClientBundle { - - @Source("documents.css") - DocumentsCSS css(); - - @Source("word.gif") - ImageResource msword(); - - @Source("excel.gif") - ImageResource msexcel(); - - @Source("powerpoint.gif") - ImageResource mspowerpoint(); +public abstract class AbstractEditEventPagesEvent extends GwtEvent<EditEventPagesEventHandler> { - @Source("image.gif") - ImageResource image(); - - @Source("pdf.gif") - ImageResource pdf(); - - @Source("unknown.gif") - ImageResource unknown(); + public static Type<EditEventPagesEventHandler> TYPE = new Type<EditEventPagesEventHandler>(); + + public AbstractEditEventPagesEvent() { + } + + public static Type<EditEventPagesEventHandler> getTYPE() { + return TYPE; + } + + @Override + public Type<EditEventPagesEventHandler> getAssociatedType() { + return TYPE; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/documents.css b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EditEventPagesEventHandler.java similarity index 81% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/documents.css rename to mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EditEventPagesEventHandler.java index 0b6e1ac56..cc8918ede 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/documents.css +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EditEventPagesEventHandler.java @@ -22,26 +22,11 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -@sprite .msword { - gwt-image: "msword"; -} - -@sprite .msexcel { - gwt-image: "msexcel"; -} +package org.silverpeas.mobile.client.apps.agenda.events.pages; -@sprite .mspowerpoint { - gwt-image: "mspowerpoint"; -} +import com.google.gwt.event.shared.EventHandler; -@sprite .pdf { - gwt-image: "pdf"; -} +public interface EditEventPagesEventHandler extends EventHandler { + void onEventSaved(EventSavedEvent event); -@sprite .image { - gwt-image: "image"; } - -@sprite .unknown { - gwt-image: "unknown"; -} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EventSavedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EventSavedEvent.java new file mode 100644 index 000000000..a566bc059 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EventSavedEvent.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.agenda.events.pages; + +public class EventSavedEvent extends AbstractEditEventPagesEvent { + + public EventSavedEvent(){ + super(); + } + + @Override + protected void dispatch(EditEventPagesEventHandler handler) { + handler.onEventSaved(this); + } + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.java index 863c2bc15..595a09367 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.java @@ -32,6 +32,7 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.ListBox; @@ -48,8 +49,9 @@ import org.silverpeas.mobile.client.common.DateUtil; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.AddButton; +import org.silverpeas.mobile.shared.dto.BaseDTO; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; @@ -67,9 +69,6 @@ public class AgendaPage extends PageContent implements AgendaPagesEventHandler { @UiField(provided = true) protected AgendaMessages msg = null; - @UiField - ActionsMenu actionsMenu; - @UiField UnorderedList events; @@ -85,9 +84,20 @@ public class AgendaPage extends PageContent implements AgendaPagesEventHandler { @UiField SpanElement message; - private AddToFavoritesButton favorite = new AddToFavoritesButton(); + private AddToFavoritesButton buttonFavorite = new AddToFavoritesButton(); + private AddButton buttonCreate = new AddButton(); + + private List<BaseDTO> allowedUsersAndGroups; - interface AgendaPageUiBinder extends UiBinder<Widget, AgendaPage> { + public void setAllowedUsersAndGroups(List<BaseDTO> baseDTOS) { + this.allowedUsersAndGroups = baseDTOS; + } + + public List<BaseDTO> getAllowedUsersAndGroups() { + return this.allowedUsersAndGroups; + } + + interface AgendaPageUiBinder extends UiBinder<Widget, AgendaPage> { } public AgendaPage() { @@ -98,6 +108,17 @@ public AgendaPage() { week.getElement().setId("btn-week"); mouth.getElement().setId("btn-month"); EventBus.getInstance().addHandler(AbstractAgendaPagesEvent.TYPE, this); + buttonCreate.setCallback(new Command() { + @Override + public void execute() { + EditEventPage edit = new EditEventPage(); + edit.setData(getApp().getApplicationInstance(), calendars); + edit.setAllowedUsersAndGroups(getAllowedUsersAndGroups()); + edit.setCurrentTimeRange(currentTimeRange); + edit.show(); + } + }); + buttonCreate.setId("create-event"); } public void setCalendars(final List<CalendarDTO> cals) { @@ -152,10 +173,13 @@ public void onCalendarEventsLoaded(final CalendarLoadedEvent event) { int endYear = DateUtil.getYear(endDate); for (GroupItem groupItem : groups) { if ((groupItem.getNumber() >= startWeek && groupItem.getNumber() <= endWeek) || (groupItem.getNumber() >= startWeek && endYear > startYear)) { - EventItem item = new EventItem(); - item.showCalendarName(isMultiCalendar()); - item.setData(event.getInstance(), dto, getCalendar(dto.getCalendarId())); - groupItem.addEvent(item); + CalendarDTO cal = getCalendar(dto.getCalendarId()); + if (cal != null) { + EventItem item = new EventItem(); + item.showCalendarName(isMultiCalendar()); + item.setData(event.getInstance(), dto, cal); + groupItem.addEvent(item); + } } } } @@ -196,10 +220,13 @@ public void onCalendarEventsLoaded(final CalendarLoadedEvent event) { for (GroupItem groupItem : groups) { if ((groupItem.getNumber() >= startMonth && groupItem.getNumber() <= endMonth) && groupItem.getYear() == startYear && groupItem.getYear() == endYear || (groupItem.getNumber() >= startMonth && endYear > startYear)) { - EventItem item = new EventItem(); - item.showCalendarName(isMultiCalendar()); - item.setData(event.getInstance(), dto, getCalendar(dto.getCalendarId())); - groupItem.addEvent(item); + CalendarDTO cal = getCalendar(dto.getCalendarId()); + if (cal != null) { + EventItem item = new EventItem(); + item.showCalendarName(isMultiCalendar()); + item.setData(event.getInstance(), dto, cal); + groupItem.addEvent(item); + } } } } @@ -215,8 +242,15 @@ public void onCalendarEventsLoaded(final CalendarLoadedEvent event) { } else { message.setInnerText(msg.noEvent()); } - actionsMenu.addAction(favorite); - favorite.init(getApp().getApplicationInstance().getId(), getApp().getApplicationInstance().getId(), ContentsTypes.Component.name(), getPageTitle()); + if (!event.getInstance().getPersonnal()) { + addActionMenu(buttonFavorite); + buttonFavorite.init(getApp().getApplicationInstance().getId(), getApp().getApplicationInstance().getId(), ContentsTypes.Component.name(), getPageTitle()); + if (event.getInstance().getRights().getWriter() || event.getInstance().getRights().getPublisher() || event.getInstance().getRights().getManager()) { + addActionShortcut(buttonCreate); + } + } else { + addActionShortcut(buttonCreate); + } } private CalendarDTO getCalendar(final String calendarId) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.ui.xml index b07b1954f..3226ad9aa 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages' /> <g:HTMLPanel ui:field="container" styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="appHeader"></h2> <div class="ui-corner-all ui-control-horizontal"> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.java new file mode 100644 index 000000000..3f59d10c9 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.java @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.agenda.pages; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.*; +import org.silverpeas.mobile.client.apps.agenda.events.TimeRange; +import org.silverpeas.mobile.client.apps.agenda.events.app.CalendarLoadEvent; +import org.silverpeas.mobile.client.apps.agenda.events.app.EventCreateEvent; +import org.silverpeas.mobile.client.apps.agenda.events.pages.*; +import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages; +import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.userselection.UserSelectionPage; +import org.silverpeas.mobile.client.components.userselection.events.components.AbstractUserSelectionComponentEvent; +import org.silverpeas.mobile.client.components.userselection.events.components.UserSelectionComponentEventHandler; +import org.silverpeas.mobile.client.components.userselection.events.components.UsersAndGroupsSelectedEvent; +import org.silverpeas.mobile.client.components.userselection.events.pages.AllowedUsersAndGroupsLoadedEvent; +import org.silverpeas.mobile.client.resources.ApplicationResources; +import org.silverpeas.mobile.shared.dto.BaseDTO; +import org.silverpeas.mobile.shared.dto.GroupDTO; +import org.silverpeas.mobile.shared.dto.UserDTO; +import org.silverpeas.mobile.shared.dto.almanach.*; +import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author svu + */ +public class EditEventPage extends PageContent implements EditEventPagesEventHandler, UserSelectionComponentEventHandler { + private static EditEventPageUiBinder uiBinder = GWT.create(EditEventPageUiBinder.class); + private ApplicationResources resources = GWT.create(ApplicationResources.class); + + @UiField(provided = true) protected AgendaMessages msg = null; + + @UiField + HTMLPanel container; + + @UiField + TextBox title, startDate, endDate; + + @UiField + TextArea description; + + @UiField + CheckBox allDay; + + @UiField + RadioButton important, notimportant, publique, prive; + + @UiField + ListBox frequency, calendars; + + @UiField + Anchor submit, selectionButton; + + @UiField + DivElement participantsSelected, icon; + + private List<BaseDTO> allowedUsersAndGroups; + + private List<BaseDTO> selectedUsersAndGroups; + + private TimeRange currentTimeRange; + + public void setAllowedUsersAndGroups(List<BaseDTO> allowedUsersAndGroups) { + this.allowedUsersAndGroups = allowedUsersAndGroups; + } + + public void setCurrentTimeRange(TimeRange currentTimeRange) { + this.currentTimeRange = currentTimeRange; + } + + interface EditEventPageUiBinder extends UiBinder<Widget, EditEventPage> { + } + + public EditEventPage() { + msg = GWT.create(AgendaMessages.class); + setPageTitle(msg.newtitleEvent()); + initWidget(uiBinder.createAndBindUi(this)); + container.getElement().setId("eventForm"); + title.getElement().setAttribute("placeholder", msg.titleField()); + description.getElement().setAttribute("placeholder", msg.descriptionField()); + description.getElement().setAttribute("rows", "6"); + startDate.getElement().setAttribute("type", "date"); + endDate.getElement().setAttribute("type", "date"); + notimportant.setValue(true); + publique.setValue(true); + submit.getElement().addClassName("formIncomplete"); + EventBus.getInstance().addHandler(AbstractEditEventPagesEvent.TYPE, this); + EventBus.getInstance().addHandler(AbstractUserSelectionComponentEvent.TYPE, this); + allDay.addValueChangeHandler(new ValueChangeHandler<Boolean>() { + @Override + public void onValueChange(ValueChangeEvent<Boolean> valueChangeEvent) { + if (valueChangeEvent.getValue()) { + startDate.getElement().setAttribute("type", "date"); + endDate.getElement().setAttribute("type", "date"); + } else { + startDate.getElement().setAttribute("type", "datetime-local"); + endDate.getElement().setAttribute("type", "datetime-local"); + } + } + }); + + frequency.addItem(msg.frequencyNone(), "NONE"); + frequency.addItem(msg.frequencyDay(), "DAY"); + frequency.addItem(msg.frequencyWeek(), "WEEK"); + frequency.addItem(msg.frequencyMouth(), "MONTH"); + frequency.addItem(msg.frequencyYear(), "YEAR"); + + icon.setInnerHTML(resources.peoples().getText()); + } + + public void setData(ApplicationInstanceDTO instance, List<CalendarDTO> calendarsDTO) { + for (CalendarDTO dto : calendarsDTO) { + calendars.addItem(dto.getTitle(), dto.getId()); + } + } + + @UiHandler("title") + protected void changeTitle(ChangeEvent event) { + validateForm(); + } + + @UiHandler("startDate") + protected void changeStartDate(ChangeEvent event) { + endDate.getElement().setAttribute("min", startDate.getValue()); + if (startDate.getText().isEmpty()) { + startDate.getElement().addClassName("formMandatoryField"); + } else { + startDate.getElement().removeClassName("formMandatoryField"); + } + validateForm(); + } + + @UiHandler("endDate") + protected void changeEndDate(ChangeEvent event) { + startDate.getElement().setAttribute("max", endDate.getValue()); + if (endDate.getText().isEmpty()) { + endDate.getElement().addClassName("formMandatoryField"); + } else { + endDate.getElement().removeClassName("formMandatoryField"); + } + validateForm(); + } + + private boolean validateForm() { + boolean valid = !startDate.getText().isEmpty() && !endDate.getText().isEmpty() && !title.getText().isEmpty(); + if (valid) { + submit.getElement().removeClassName("formIncomplete"); + } else { + submit.getElement().addClassName("formIncomplete"); + } + return valid; + } + + @UiHandler("submit") + protected void save(ClickEvent event) { + if (!submit.getElement().hasClassName("formIncomplete")) { + CalendarEventCreationDTO dto = new CalendarEventCreationDTO(); + dto.setEventType("CalendarEvent"); + dto.setOccurrenceType("CalendarEventOccurrence"); + dto.setEventId("volatile-" + new Date().getTime()); + CalendarDTO calendarDTO = new CalendarDTO(); + calendarDTO.setId(calendars.getSelectedValue()); + dto.setCalendar(calendarDTO); + dto.setTitle(title.getText()); + dto.setOnAllDay(allDay.getValue()); + if (allDay.getValue()) { + dto.setStartDate(startDate.getText()); + dto.setEndDate(endDate.getText()); + } else { + dto.setStartDate(startDate.getText()+":00+01:00"); + dto.setEndDate(endDate.getText()+":00+01:00"); + } + dto.setDescription(description.getText()); + if (important.getValue()) dto.setPriority(PriorityDTO.HIGH.name()); + if (notimportant.getValue()) dto.setPriority(PriorityDTO.NORMAL.name()); + if (publique.getValue()) dto.setVisibility(VisibilityLevelDTO.PUBLIC.name()); + if (prive.getValue()) dto.setVisibility(VisibilityLevelDTO.PRIVATE.name()); + if (!frequency.getSelectedValue().equals("NONE")) { + CalendarEventRecurrenceDTO rec = new CalendarEventRecurrenceDTO(); + CalendarEventRecurrenceDTO.FrequencyDTO freq = new CalendarEventRecurrenceDTO.FrequencyDTO(); + freq.setTimeUnit(TimeUnitDTO.valueOf(frequency.getSelectedValue())); + freq.setInterval(1); + rec.setFrequency(freq); + dto.setRecurrence(rec); + } + dto.setAttendees(getAttendees()); + EventCreateEvent ev = new EventCreateEvent(dto); + EventBus.getInstance().fireEvent(ev); + } + } + + private List<CalendarEventAttendeeDTO> getAttendees() { + List<CalendarEventAttendeeDTO> attendees = new ArrayList<>(); + if (selectedUsersAndGroups != null) { + for (BaseDTO sel : selectedUsersAndGroups) { + CalendarEventAttendeeDTO a = new CalendarEventAttendeeDTO(); + a.setId(sel.getId()); + if (sel instanceof UserDTO) { + a.setFullName(((UserDTO) sel).getFirstName() + ((UserDTO) sel).getLastName()); + } + a.setParticipationStatus(ParticipationStatusDTO.AWAITING); + a.setPresenceStatus(PresenceStatusDTO.INFORMATIVE); + attendees.add(a); + } + } + return attendees; + } + + @UiHandler("selectionButton") + protected void onUserSelection(ClickEvent event) { + UserSelectionPage page = new UserSelectionPage(); + if (selectedUsersAndGroups != null) { + List<String> ids = new ArrayList<>(); + for (BaseDTO sel : selectedUsersAndGroups) { + if (sel instanceof UserDTO) ids.add(sel.getId()); + } + page.setPreSelectedUsersIds(ids); + } + page.show(); + AllowedUsersAndGroupsLoadedEvent ev = new AllowedUsersAndGroupsLoadedEvent(allowedUsersAndGroups, true); + EventBus.getInstance().fireEvent(ev); + } + + @Override + public void onUsersAndGroupSelected(UsersAndGroupsSelectedEvent event) { + this.selectedUsersAndGroups = event.getUsersAndGroupsSelected(); + String selectionNames = ""; + for (BaseDTO sel : selectedUsersAndGroups) { + if (sel instanceof UserDTO) { + selectionNames += ((UserDTO) sel).getFirstName() + " " + ((UserDTO) sel).getLastName() + " , "; + } else if (sel instanceof GroupDTO) { + selectionNames += ((GroupDTO) sel).getName() + " , "; + } + } + selectionNames = selectionNames.substring(0, selectionNames.length() - 2); + participantsSelected.setInnerText(selectionNames); + } + + @Override + public void onEventSaved(EventSavedEvent event) { + back(); + EventBus.getInstance().fireEvent(new CalendarLoadEvent(null, currentTimeRange)); + } + + @Override + public void stop() { + EventBus.getInstance().removeHandler(AbstractUserSelectionComponentEvent.TYPE, this); + EventBus.getInstance().removeHandler(AbstractEditEventPagesEvent.TYPE, this); + super.stop(); + } + +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.ui.xml new file mode 100644 index 000000000..10af8a2c4 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.ui.xml @@ -0,0 +1,85 @@ +<!-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "https://www.silverpeas.org/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" + xmlns:g="urn:import:com.google.gwt.user.client.ui" + xmlns:base="urn:import:org.silverpeas.mobile.client.components.base" + xmlns:components="urn:import:org.silverpeas.mobile.client.components"> + + <ui:with field='msg' type='org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages' /> + + <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> + + <span class="calendars"> + <label><ui:text from="{msg.calendarField}" /></label> + <g:ListBox ui:field="calendars"></g:ListBox> + </span> + + <g:TextBox ui:field="title" styleName="title"/> + <g:CheckBox ui:field="allDay" text="{msg.allDay}" styleName="allDay" value="true"/> + + <span class="startDate"> + <label><ui:text from="{msg.startDate}" /></label> + <g:TextBox ui:field="startDate" stylePrimaryName="formMandatoryField"/> + </span> + <span class="endDate"> + <label><ui:text from="{msg.endDate}" /></label> + <g:TextBox ui:field="endDate" stylePrimaryName="formMandatoryField"/> + </span> + <g:TextArea ui:field="description" styleName="description"/> + + <span class="priority"> + <label><ui:text from="{msg.importantField}" /></label> + <g:RadioButton ui:field="important" name="priority"><ui:text from="{msg.yes}" /></g:RadioButton> + <g:RadioButton ui:field="notimportant" name="priority"><ui:text from="{msg.no}" /></g:RadioButton> + </span> + <span class="visibility"> + <label><ui:text from="{msg.visibilityField}" /></label> + <g:RadioButton ui:field="publique" name="visibility"><ui:text from="{msg.publicValue}" /></g:RadioButton> + <g:RadioButton ui:field="prive" name="visibility"><ui:text from="{msg.privateValue}" /></g:RadioButton> + </span> + + <span class="frequency"> + <label><ui:text from="{msg.frequencyField}" /></label> + <g:ListBox ui:field="frequency"></g:ListBox> + </span> + + <span class="participants"> + <label><ui:text from="{msg.attendeesField}" /></label> + <g:Anchor ui:field="selectionButton"> + <div ui:field="icon"></div> + <div ui:field="participantsSelected" class="selection"></div> + </g:Anchor> + </span> + + <div class=" ui-controlgroup ui-controlgroup-horizontal"> + <div class="ui-controlgroup-controls "> + <g:Anchor ui:field="submit" styleName="btn-validate ui-link"> + <span class="ui-btn-text"><ui:text from="{msg.create}"/></span> + </g:Anchor> + </div> + </div> + </g:HTMLPanel> +</ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.java index f36b0d447..1620de6ba 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.java @@ -39,10 +39,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.ListBox; -import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.*; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.agenda.events.app.AttachmentsLoadEvent; import org.silverpeas.mobile.client.apps.agenda.events.app.ReminderCreateEvent; @@ -69,8 +66,8 @@ import org.silverpeas.mobile.client.common.PublicationContentHelper; import org.silverpeas.mobile.client.components.UnorderedList; import org.silverpeas.mobile.client.components.attachments.Attachment; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventAttendeeDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventAttributeDTO; @@ -90,6 +87,7 @@ */ public class EventPage extends PageContent implements EventPagesEventHandler { private static EventPageUiBinder uiBinder = GWT.create(EventPageUiBinder.class); + private ApplicationResources resources = GWT.create(ApplicationResources.class); @UiField(provided = true) protected AgendaMessages msg = null; @@ -115,8 +113,7 @@ public class EventPage extends PageContent implements EventPagesEventHandler { UnorderedList attachments, attendees; @UiField - ActionsMenu actionsMenu; - + InlineHTML iconParticipants; private CalendarEventDTO event; private CalendarDTO calendar; private ReminderDTO reminderDTO; @@ -144,6 +141,7 @@ public EventPage() { container.getElement().setId("event"); dateEvent.setId("date-event"); attachments.setId("attachments"); + iconParticipants.setHTML(resources.peoples().getText()); EventBus.getInstance().addHandler(AbstractEventPagesEvent.TYPE, this); } @@ -237,9 +235,9 @@ public void setData(ApplicationInstanceDTO instance, CalendarEventDTO event, Cal for (CalendarEventAttendeeDTO attendee : event.getAttendees()) { if (attendee.getId().equals(SpMobil.getUser().getId())) { - actionsMenu.addAction(participation); - actionsMenu.addAction(rejectParticipation); - actionsMenu.addAction(tentativeParticipation); + addActionMenu(participation); + addActionMenu(rejectParticipation); + addActionMenu(tentativeParticipation); participation.setVisible(!attendee.getParticipationStatus().equals(ParticipationStatusDTO.ACCEPTED)); rejectParticipation.setVisible(!attendee.getParticipationStatus().equals(ParticipationStatusDTO.DECLINED)); tentativeParticipation.setVisible(!attendee.getParticipationStatus().equals(ParticipationStatusDTO.TENTATIVE)); @@ -255,15 +253,15 @@ public void setData(ApplicationInstanceDTO instance, CalendarEventDTO event, Cal } // actions - actionsMenu.addAction(addReminder); + addActionMenu(addReminder); notification.init(instance.getId(), event.getEventId(), NotificationDTO.TYPE_EVENT, event.getTitle(), getPageTitle()); - actionsMenu.addAction(notification); + addActionMenu(notification); } @Override public void onRemindersLoaded(final RemindersLoadedEvent event) { if (event.getDurations().isEmpty()) { - actionsMenu.removeAction(addReminder.getId(), true); + removeActionMenu(addReminder); } for (String duration : event.getDurations()) { String durationLabel = ""; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.ui.xml index 48c55b720..dba972530 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.ui.xml @@ -31,12 +31,11 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 ui:field="header" class="appHeader"></h2> <p ui:field="description" class="publiDesc"></p> <div ui:field="reminder" class="rappel-event" style="display:none;"> - <g:ListBox ui:field="reminderDurations"/> + <g:ListBox ui:field="reminderDurations" styleName="filter-list"/> <div class="actions-rappel"> <g:Anchor ui:field="delete" styleName="delete"><ui:text from="{msg.delete}" /></g:Anchor> </div> @@ -59,7 +58,9 @@ <components:UnorderedList ui:field="attachments"/> - <div id="participation" class=" elts-pub "> <span class="label">Participants :</span> + <div id="participation" class=" elts-pub "> + <g:InlineHTML ui:field="iconParticipants" styleName="icon-participation"/> + <span class="label"><ui:text from="{msg.participants}" /></span> <components:UnorderedList ui:field="attendees"/> </div> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AcceptParticipationButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AcceptParticipationButton.java index ceb69d9ec..c3f651b38 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AcceptParticipationButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AcceptParticipationButton.java @@ -35,6 +35,7 @@ import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; import org.silverpeas.mobile.shared.dto.almanach.ParticipationStatusDTO; @@ -69,7 +70,7 @@ void acceptParticipation(ClickEvent event) { EventBus.getInstance().fireEvent(new ParticipationEvent(ParticipationStatusDTO.ACCEPTED, eventDTO)); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AddReminderButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AddReminderButton.java index 37f342dad..708ee12cf 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AddReminderButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/AddReminderButton.java @@ -35,6 +35,7 @@ import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; /** * @author svu @@ -67,7 +68,7 @@ void addReminder(ClickEvent event) { EventBus.getInstance().fireEvent(new RemindersAddingEvent()); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/EventItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/EventItem.java index 260d0fa19..b004f77d2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/EventItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/EventItem.java @@ -34,7 +34,6 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.agenda.pages.EventPage; import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/RejectParticipationButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/RejectParticipationButton.java index 1d08937d3..3b7653fe8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/RejectParticipationButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/RejectParticipationButton.java @@ -35,6 +35,7 @@ import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; import org.silverpeas.mobile.shared.dto.almanach.ParticipationStatusDTO; @@ -69,7 +70,7 @@ void reject(ClickEvent event) { EventBus.getInstance().fireEvent(new ParticipationEvent(ParticipationStatusDTO.DECLINED, eventDTO)); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/TentativeParticipationButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/TentativeParticipationButton.java index 2d60e75cd..0fb525174 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/TentativeParticipationButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/widgets/TentativeParticipationButton.java @@ -29,13 +29,13 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; import org.silverpeas.mobile.client.apps.agenda.events.app.ParticipationEvent; import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; import org.silverpeas.mobile.shared.dto.almanach.ParticipationStatusDTO; @@ -70,7 +70,7 @@ void tentative(ClickEvent event) { EventBus.getInstance().fireEvent(new ParticipationEvent(ParticipationStatusDTO.TENTATIVE, eventDTO)); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.java index 4df42e804..e850517d2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.java @@ -62,6 +62,8 @@ public interface AgendaMessages extends Messages { String addReminder(); String acceptParticipation(); + + String participants(); String rejectParticipation(); String tentativeParticipation(); @@ -94,4 +96,30 @@ public interface AgendaMessages extends Messages { String noEvent(); String the(); + String create(); + + String newtitleEvent(); + + String calendarField(); + String allDay(); + + String startDate(); + String endDate(); + + String titleField(); + String descriptionField(); + String importantField(); + String visibilityField(); + String yes(); + String no(); + String publicValue(); + String privateValue(); + String frequencyField(); + String attendeesField(); + + String frequencyNone(); + String frequencyDay(); + String frequencyWeek(); + String frequencyMouth(); + String frequencyYear(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.properties index 390822a9b..d231d19f1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.properties @@ -58,7 +58,7 @@ addReminder=Ajouter rappel acceptParticipation=Participer rejectParticipation=Ne pas participer tentativeParticipation=Participer peut être - +participants=Participants : weekFilter=Semaine mouthFilter=Mois @@ -86,4 +86,27 @@ friday=Vendredi saturday=Samedi sunday=Dimanche -noEvent=Pas d''événements à venir \ No newline at end of file +noEvent=Pas d''événements à venir +create=Créer +newtitleEvent= Nouvel événement + +calendarField=Calendrier : +allDay=Toute la journée +startDate=Début: +endDate=Fin: +titleField=Titre +descriptionField=Description +importantField=Important : +visibilityField=Visibilité : +yes=Oui +no=Non +publicValue=Publique +privateValue=Privé +frequencyField=Récurrence : +attendeesField=Participants : + +frequencyNone=Aucune +frequencyDay=Tous les jours +frequencyWeek=Toutes les semaines +frequencyMouth=Tous les mois +frequencyYear=Tous les ans \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_en.properties index d32cc9a11..ceb193128 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_en.properties @@ -58,6 +58,7 @@ addReminder=Add reminder acceptParticipation=Join in rejectParticipation=Not join in tentativeParticipation=Join in maybe +participants=Participants : weekFilter=Week mouthFilter=Mouth @@ -85,4 +86,27 @@ friday=Friday saturday=Saturday sunday=Sunday -noEvent=No upcoming events \ No newline at end of file +noEvent=No upcoming events +create=Create +newtitleEvent= New event + +calendarField=Calendar : +allDay= All day +startDate=Start: +endDate=End: +titleField=Title +descriptionField=Description +importantField=Important : +visibilityField=Visibilité : +yes=Yes +no=No +publicValue=Public +privateValue=Private +frequencyField=Frequency : +attendeesField=Attendees + +frequencyNone=None +frequencyDay=Every days +frequencyWeek=Every weeks +frequencyMouth=Every mouths +frequencyYear=Every years \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_fr.properties index 9b82b26c5..d231d19f1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages_fr.properties @@ -58,6 +58,7 @@ addReminder=Ajouter rappel acceptParticipation=Participer rejectParticipation=Ne pas participer tentativeParticipation=Participer peut être +participants=Participants : weekFilter=Semaine mouthFilter=Mois @@ -85,4 +86,27 @@ friday=Vendredi saturday=Samedi sunday=Dimanche -noEvent=Pas d''événements à venir \ No newline at end of file +noEvent=Pas d''événements à venir +create=Créer +newtitleEvent= Nouvel événement + +calendarField=Calendrier : +allDay=Toute la journée +startDate=Début: +endDate=Fin: +titleField=Titre +descriptionField=Description +importantField=Important : +visibilityField=Visibilité : +yes=Oui +no=Non +publicValue=Publique +privateValue=Privé +frequencyField=Récurrence : +attendeesField=Participants : + +frequencyNone=Aucune +frequencyDay=Tous les jours +frequencyWeek=Toutes les semaines +frequencyMouth=Tous les mois +frequencyYear=Tous les ans \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/BlogApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/BlogApp.java index cdf39b769..bd971e74e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/BlogApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/BlogApp.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.client.apps.blog; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.apps.blog.events.app.AbstractBlogAppEvent; import org.silverpeas.mobile.client.apps.blog.events.app.BlogAppEventHandler; @@ -98,8 +99,6 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { @Override public void showContent(final NavigationShowContentEvent event) { - if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.blog.name())) { - super.showContent(event); - } + // Managed by Document app } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.java index e710dc25a..53c8b89f4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.java @@ -40,9 +40,10 @@ import org.silverpeas.mobile.client.apps.blog.resources.BlogMessages; import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.ShareButton; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.blog.PostDTO; @@ -62,11 +63,10 @@ public class BlogPage extends PageContent implements BlogPagesEventHandler { @UiField UnorderedList news; @UiField - ActionsMenu actionsMenu; - @UiField ListBox categories; private AddToFavoritesButton favorite = new AddToFavoritesButton(); + private ShareButton share = new ShareButton(); private String instanceId; interface BlogPageUiBinder extends UiBinder<Widget, BlogPage> { @@ -129,8 +129,10 @@ public int compare(Map.Entry<String, String> o1, } categories.setSelectedIndex(oldSelection); - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), getPageTitle()); + addActionMenu(share); + share.init(getPageTitle(), getPageTitle(), LinksManager.createApplicationPermalink(instanceId)); } @UiHandler("categories") diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.ui.xml index f20201cc4..f77f4e3c8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/BlogPage.ui.xml @@ -31,8 +31,7 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.blog.resources.BlogMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> - <div class="content-navigation"><g:ListBox ui:field="categories"/></div> + <div class="content-navigation"><g:ListBox ui:field="categories" styleName="filter-list"/></div> <components:UnorderedList ui:field="news" styleName="liste-billet"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/widgets/BlogItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/widgets/BlogItem.java index 6c4e162d1..e0bfe3a8b 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/widgets/BlogItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/blog/pages/widgets/BlogItem.java @@ -77,6 +77,7 @@ public void onClick(final ClickEvent event) { ContentDTO content = new ContentDTO(); content.setId(data.getId()); content.setType(ContentsTypes.Publication.toString()); + content.setInstanceId(data.getInstanceId()); EventBus.getInstance().fireEvent(new NavigationShowContentEvent(content)); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.java index 958982422..9a44490fb 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.java @@ -50,7 +50,6 @@ import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeRecognizer; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.FormFieldDTO; import org.silverpeas.mobile.shared.dto.classifieds.ClassifiedDTO; @@ -66,9 +65,6 @@ public class ClassifiedPage extends PageContent implements ClassifiedsPagesEvent @UiField(provided = true) protected ClassifiedsMessages msg = null; - @UiField - ActionsMenu actionsMenu; - @UiField HTML price, time, author; @@ -148,7 +144,7 @@ public void setData(ClassifiedDTO data) { } notification.init(getApp().getApplicationInstance().getId(), data.getId(), NotificationDTO.TYPE_EVENT, data.getTitle(), getPageTitle()); - actionsMenu.addAction(notification); + addActionMenu(notification); if (hasComments) { String contentType = "Classified"; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.ui.xml index a9ebcb854..d7ce649fe 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedPage.ui.xml @@ -32,7 +32,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.classifieds.resources.ClassifiedsMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <div id="classified" class="content-navigation"> <g:HTMLPanel tag="h2" ui:field="title" styleName="title"></g:HTMLPanel> <g:FocusPanel ui:field="carroussel" styleName="classified_pictures"> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.java index 7766ebef0..9483d7c94 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.java @@ -40,7 +40,6 @@ import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.classifieds.ClassifiedDTO; @@ -54,8 +53,6 @@ public class ClassifiedsPage extends PageContent implements ClassifiedsPagesEven @UiField UnorderedList classifieds; @UiField - ActionsMenu actionsMenu; - @UiField ListBox categories, types; @@ -94,7 +91,7 @@ public void onClassifiedsLoad(final ClassifiedsLoadedEvent event) { } displayList(); - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(getApp().getApplicationInstance().getId(), getApp().getApplicationInstance().getId(), ContentsTypes.Component.name(), getPageTitle()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.ui.xml index 34a928bab..b06a6165d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/classifieds/pages/ClassifiedsPage.ui.xml @@ -31,14 +31,13 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.classifieds.resources.ClassifiedsMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> - <div class="content-navigation"> + <div class="content-navigation filter-classifield"> <span class="ui-btn-text"><ui:text from="{msg.category}"/></span> - <g:ListBox ui:field="categories"/> + <g:ListBox ui:field="categories" styleName="filter-list"/> </div> - <div class="content-navigation"> + <div class="content-navigation filter-classifield"> <span class="ui-btn-text"><ui:text from="{msg.type}"/></span> - <g:ListBox ui:field="types"/> + <g:ListBox ui:field="types" styleName="filter-list"/> </div> <components:UnorderedList ui:field="classifieds" styleName="liste-annonces"/> </g:HTMLPanel> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java index 4720da6ed..2c03d528f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java @@ -97,7 +97,6 @@ public void addComment(final AddCommentEvent event) { dto.setComponentId(event.getInstanceId()); dto.setResourceId(event.getContentId()); dto.setResourceType(event.getContentType()); - dto.setTextForHtml(event.getMessage()); MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<CommentDTO>() { @Override diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/pages/CommentsPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/pages/CommentsPage.java index ac59ce88c..43ac00157 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/pages/CommentsPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/pages/CommentsPage.java @@ -78,7 +78,6 @@ public CommentsPage() { initWidget(uiBinder.createAndBindUi(this)); EventBus.getInstance().addHandler(AbstractCommentsPagesEvent.TYPE, this); container.getElement().setId("publication"); - addCommentTitle.setInnerHTML(msg.addComment()); } public void setContentInfos(final String contentId, final String instanceId, final String contentType) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/ConfigApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/ConfigApp.java index fba938c3a..b29b8658a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/ConfigApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/ConfigApp.java @@ -82,4 +82,51 @@ public void loadConfig(LoadConfigEvent event) { public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { } + + public static class ConfigApp extends App implements ConfigAppEventHandler { + + private static ConfigApp instance = null; + + public ConfigApp() { + super(); + EventBus.getInstance().addHandler(AbstractConfigAppEvent.TYPE, this); + } + + public void start() { + setMainPage(new ConfigPage()); + super.start(); + } + + + @Override + public void stop() { + EventBus.getInstance().removeHandler(AbstractConfigAppEvent.TYPE, this); + super.stop(); + } + + + public static ConfigApp getInstance() { + if (instance == null) { + instance = new ConfigApp(); + } + return instance; + } + + @Override + public void updateConfig(UpdateConfigEvent event) { + Config conf = event.getConfig(); + LocalStorageHelper.getInstance().store("config", conf.getAutoBean()); + } + + @Override + public void loadConfig(LoadConfigEvent event) { + Config conf = SpMobil.getConfiguration(); + EventBus.getInstance().fireEvent(new ConfigLoadedEvent(conf)); + } + + @Override + public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { + + } + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.java index 791bf972e..9ee94312b 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.java @@ -25,20 +25,32 @@ package org.silverpeas.mobile.client.apps.config.pages; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.InputElement; +import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.RadioButton; +import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.config.events.app.LoadConfigEvent; import org.silverpeas.mobile.client.apps.config.events.app.UpdateConfigEvent; import org.silverpeas.mobile.client.apps.config.events.pages.AbstractConfigPagesEvent; import org.silverpeas.mobile.client.apps.config.events.pages.ConfigLoadedEvent; import org.silverpeas.mobile.client.apps.config.events.pages.ConfigPagesEventHandler; +import org.silverpeas.mobile.client.apps.config.resources.ConfigMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.userselection.widgets.events.ChangeEvent; import org.silverpeas.mobile.shared.dto.configuration.Config; +import javax.print.Doc; + /** * @author: svu */ @@ -53,12 +65,41 @@ public class ConfigPage extends PageContent implements ConfigPagesEventHandler { @UiField CheckBox lastPublicationsDisplay, lastEventsDisplay; @UiField - CheckBox favoritesDisplay, shortCutsDisplay; + CheckBox favoritesDisplay, shortCutsDisplay, shortCutsToolsDisplay; + + @UiField + RadioButton standard, grayscale, sepia, inverse; + + @UiField + InputElement fontSize; + + @UiField(provided = true) + protected ConfigMessages msg; + private Config config; public ConfigPage() { + msg = GWT.create(ConfigMessages.class); initWidget(uiBinder.createAndBindUi(this)); EventBus.getInstance().addHandler(AbstractConfigPagesEvent.TYPE, this); EventBus.getInstance().fireEvent(new LoadConfigEvent()); + setPageTitle(msg.title()); + fontSize.setAttribute("min", "9"); + fontSize.setAttribute("max", "17"); + fontSize.setAttribute("step", "1"); + fontSize.setAttribute("value", String.valueOf(SpMobil.getConfiguration().getFontSize())); + addListenerInput(fontSize, this); + } + + public native void addListenerInput(Element range, ConfigPage page) /*-{ + range.addEventListener('input', function () { + page.@org.silverpeas.mobile.client.apps.config.pages.ConfigPage::updateFontSize(I)(range.value); + }, false); + }-*/; + + private void updateFontSize(final int value) { + fontSize.setAttribute("value", String.valueOf(value)); + SpMobil.setFontSize(value); + save(); } @Override @@ -73,7 +114,33 @@ public void onPreviewNativeEvent(Event.NativePreviewEvent event) { public void stop() { super.stop(); EventBus.getInstance().removeHandler(AbstractConfigPagesEvent.TYPE, this); + } + + @UiHandler("standard") + protected void standard(ClickEvent event) { + Config c = new Config(); + c.setStandard(true); + SpMobil.setFilter(c); + } + @UiHandler("grayscale") + protected void grayscale(ClickEvent event) { + Config c = new Config(); + c.setGrayscale(true); + SpMobil.setFilter(c); + } + + @UiHandler("sepia") + protected void sepia(ClickEvent event) { + Config c = new Config(); + c.setSepia(true); + SpMobil.setFilter(c); + } + @UiHandler("inverse") + protected void inverse(ClickEvent event) { + Config c = new Config(); + c.setInverse(true); + SpMobil.setFilter(c); } @Override @@ -84,6 +151,11 @@ public void onConfigLoaded(ConfigLoadedEvent event) { favoritesDisplay.setValue(config.isFavoritesDisplay()); lastEventsDisplay.setValue(config.isLastEventsDisplay()); shortCutsDisplay.setValue(config.isShortCutsDisplay()); + shortCutsToolsDisplay.setValue(config.isShortCutsToolsDisplay()); + standard.setValue(config.isStandard()); + grayscale.setValue(config.isGrayscale()); + sepia.setValue(config.isSepia()); + inverse.setValue(config.isInverse()); } private void save() { @@ -92,6 +164,12 @@ private void save() { config.setLastPublicationsDisplay(lastPublicationsDisplay.getValue()); config.setLastEventsDisplay(lastEventsDisplay.getValue()); config.setShortCutsDisplay(shortCutsDisplay.getValue()); + config.setShortCutsToolsDisplay(shortCutsToolsDisplay.getValue()); + config.setFontSize(Integer.parseInt(fontSize.getAttribute("value"))); + config.setStandard(standard.getValue()); + config.setGrayscale(grayscale.getValue()); + config.setSepia(sepia.getValue()); + config.setInverse(inverse.getValue()); EventBus.getInstance().fireEvent(new UpdateConfigEvent(config)); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.ui.xml index 8924a4fa0..19997fc06 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.ui.xml @@ -25,37 +25,56 @@ <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> + + <ui:with field='msg' type='org.silverpeas.mobile.client.apps.config.resources.ConfigMessages'/> + <g:HTMLPanel ui:field="container" styleName="ui-content ui-body-a"> <g:HTMLPanel stylePrimaryName="last-publication-bloc bloc"> - <h3 class="title-bloc-part ui-title">Page d'accueil</h3> + <h3 class="title-bloc-part ui-title"><ui:text from="{msg.homePage}"/></h3> <ul class="ui-listview ui-listview-inset ui-corner-all ui-shadow config"> <li class="actuality"> <a class="ui-btn"> - <g:CheckBox ui:field="newsDisplay" text="Afficher les dernières actualités"></g:CheckBox> + <g:CheckBox ui:field="newsDisplay" text="{msg.lastNews}"></g:CheckBox> </a> </li> <li class="publication"> <a class="ui-btn"> - <g:CheckBox ui:field="lastPublicationsDisplay" text="Afficher les dernières publications"></g:CheckBox> + <g:CheckBox ui:field="lastPublicationsDisplay" text="{msg.lastPublications}"></g:CheckBox> </a> </li> <li class="event"> <a class="ui-btn"> - <g:CheckBox ui:field="lastEventsDisplay" text="Afficher les prochains événements"></g:CheckBox> + <g:CheckBox ui:field="lastEventsDisplay" text="{msg.events}"></g:CheckBox> </a> </li> <li class="favoris"> <a class="ui-btn"> - <g:CheckBox ui:field="favoritesDisplay" text="Afficher les favoris"></g:CheckBox> + <g:CheckBox ui:field="favoritesDisplay" text="{msg.favorites}"></g:CheckBox> </a> </li> <li class="shortcut"> <a class="ui-btn"> - <g:CheckBox ui:field="shortCutsDisplay" text="Afficher les raccourcis"></g:CheckBox> + <g:CheckBox ui:field="shortCutsDisplay" text="{msg.shortcurts}"></g:CheckBox> + </a> + </li> + <li class="shortcutools"> + <a class="ui-btn"> + <g:CheckBox ui:field="shortCutsToolsDisplay" text="{msg.tools}"></g:CheckBox> </a> </li> </ul> + <h3 class="title-bloc-part ui-title"><ui:text from="{msg.fontSize}"/></h3> + <input type="range" ui:field="fontSize" class="font-percent-size"></input> + + <h3 class="title-bloc-part ui-title"><ui:text from="{msg.filters}"/></h3> + <span class="filters"> + <g:RadioButton ui:field="standard" name="filters" stylePrimaryName="filter"><ui:text from="{msg.standard}"/></g:RadioButton> + <g:RadioButton ui:field="grayscale" name="filters" stylePrimaryName="filter"><ui:text from="{msg.grayscale}" /></g:RadioButton> + <g:RadioButton ui:field="sepia" name="filters" stylePrimaryName="filter"><ui:text from="{msg.sepia}" /></g:RadioButton> + <g:RadioButton ui:field="inverse" name="filters" stylePrimaryName="filter"><ui:text from="{msg.inverse}" /></g:RadioButton> + </span> + </g:HTMLPanel> </g:HTMLPanel> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.java new file mode 100644 index 000000000..896f49e10 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.config.resources; + +import com.google.gwt.i18n.client.Messages; +import com.google.gwt.safehtml.shared.SafeHtml; + +public interface ConfigMessages extends Messages { + + String title(); + String homePage(); + String fontSize(); + String tools(); + String shortcurts(); + String favorites(); + + String events(); + String lastPublications(); + String lastNews(); + + String filters(); + String grayscale(); + String sepia(); + String inverse(); + String standard(); + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.properties new file mode 100644 index 000000000..9ddd28f98 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.properties @@ -0,0 +1,39 @@ +# +# Copyright (C) 2000 - 2022 Silverpeas +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# As a special exception to the terms and conditions of version 3.0 of +# the GPL, you may redistribute this Program in connection with Free/Libre +# Open Source Software ("FLOSS") applications as described in Silverpeas's +# FLOSS exception. You should have received a copy of the text describing +# the FLOSS exception, and it is also available here: +# "https://www.silverpeas.org/legal/floss_exception.html" +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +title=Configuration +fontSize=Taille du texte +homePage=Page d''accueil +tools=Afficher les outils +shortcurts=Afficher les raccourcis +favorites=Afficher les favoris +events=Afficher les prochains événements +lastPublications=Afficher les dernières publications +lastNews=Afficher les dernières actualités + +filters=Filtres +grayscale=Niveau de gris +sepia=Sepia +inverse=Inversé +standard=Standard diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_en.properties new file mode 100644 index 000000000..baefd989f --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_en.properties @@ -0,0 +1,39 @@ +# +# Copyright (C) 2000 - 2022 Silverpeas +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# As a special exception to the terms and conditions of version 3.0 of +# the GPL, you may redistribute this Program in connection with Free/Libre +# Open Source Software ("FLOSS") applications as described in Silverpeas's +# FLOSS exception. You should have received a copy of the text describing +# the FLOSS exception, and it is also available here: +# "https://www.silverpeas.org/legal/floss_exception.html" +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +title=Settings +fontSize=Text size +homePage=Home page +tools=Display tools +shortcurts=Display shortcuts +favorites=Display favorites +events=Display last events +lastPublications=Display last publications +lastNews=Display last news + +filters=Filters +grayscale=Grayscales +sepia=Sepia +inverse=Inverse +standard=Standard \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_fr.properties new file mode 100644 index 000000000..347a889d1 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_fr.properties @@ -0,0 +1,39 @@ +# +# Copyright (C) 2000 - 2022 Silverpeas +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# As a special exception to the terms and conditions of version 3.0 of +# the GPL, you may redistribute this Program in connection with Free/Libre +# Open Source Software ("FLOSS") applications as described in Silverpeas's +# FLOSS exception. You should have received a copy of the text describing +# the FLOSS exception, and it is also available here: +# "https://www.silverpeas.org/legal/floss_exception.html" +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +title=Configuration +fontSize=Taille du texte +homePage=Page d''accueil +tools=Afficher les outils +shortcurts=Afficher les raccourcis +favorites=Afficher les favoris +events=Afficher les prochains événements +lastPublications=Afficher les dernières publications +lastNews=Afficher les dernières actualités + +filters=Filtres +grayscale=Niveau de gris +sepia=Sepia +inverse=Inversé +standard=Standard \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/ContactsPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/ContactsPage.java index eace21815..02c5138d7 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/ContactsPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/ContactsPage.java @@ -122,9 +122,10 @@ public void init(boolean limited) { allcontacts.setVisible(tabs.contains("allcontacts")); allextcontacts.setVisible(tabs.contains("allextcontacts")); - Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { + //Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { + Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() { @Override - public void execute() { + public boolean execute() { if (defaultTab.equals("mycontacts")) { EventBus.getInstance().fireEvent( new ContactsLoadEvent(ContactFilters.MY, filter.getText(), computePageSize(), @@ -142,6 +143,7 @@ public void execute() { startIndex)); currentType = ContactFilters.ALL; allcontacts.addStyleName("ui-btn-active"); + allcontacts.removeStyleName("ui-last-child"); if (!mycontacts.isVisible()) { allcontacts.addStyleName("ui-first-child"); } @@ -161,8 +163,9 @@ public void execute() { allextcontacts.addStyleName("ui-last-child"); filter.setVisible(true); } + return false; } - }); + }, 500); } else { mycontacts.setVisible(false); allextcontacts.setVisible(false); @@ -307,7 +310,6 @@ private int computePageSize() { item.getElement().getStyle().setVisibility(Style.Visibility.HIDDEN); list.add(item); int itemHeight = item.getOffsetHeight(); - pageSize = (available / itemHeight) + 1; // add one for scroll list.remove(item); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java index 2bf0d4e7b..5e4cdb659 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java @@ -25,6 +25,8 @@ package org.silverpeas.mobile.client.apps.contacts.pages.widgets; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; @@ -36,9 +38,11 @@ import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.contacts.resources.ContactsResources; +import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.DetailUserDTO; +import org.silverpeas.mobile.shared.dto.PropertyDTO; public class ContactItem extends Composite { @@ -85,72 +89,64 @@ public void setData(DetailUserDTO userData) { int nbTel = 0; if (userData.getPhoneNumber() != null && !userData.getPhoneNumber().isEmpty()) { - Anchor tel1 = new Anchor(); - tel1.setStyleName("tel-link"); - tel1.setText(userData.getPhoneNumber()); - tel1.setHref("tel:" + userData.getPhoneNumber()); - tel.add(tel1); + createPhoneFragment(tel, userData.getPhoneNumber()); nbTel++; } if (userData.getCellularPhoneNumber() != null && !userData.getCellularPhoneNumber().isEmpty()) { if (nbTel == 1) { tel.add(new InlineHTML(" | ")); } - Anchor tel2 = new Anchor(); - tel2.setStyleName("tel-link"); - tel2.setText(userData.getCellularPhoneNumber()); - tel2.setHref("tel:" + userData.getCellularPhoneNumber()); - tel.add(tel2); - - Anchor sms = new Anchor(); - sms.setHref("sms:" + userData.getCellularPhoneNumber()); - Image smsImg = new Image(resourcesContact.sms()); - sms.getElement().appendChild(smsImg.getElement()); - tel.add(sms); - + createPhoneFragment(tel, userData.getCellularPhoneNumber()); + createSmsFragment(tel, userData.getCellularPhoneNumber()); nbTel++; } if (userData.getFaxPhoneNumber() != null && !userData.getFaxPhoneNumber().isEmpty()) { if (nbTel == 2) { tel.add(new InlineHTML(" | ")); } - Anchor tel3 = new Anchor(); - tel3.setStyleName("tel-link"); - tel3.setText(userData.getFaxPhoneNumber()); - tel3.setHref("tel:" + userData.getFaxPhoneNumber()); - tel.add(tel3); + createPhoneFragment(tel, userData.getPhoneNumber()); + createPhoneFragment(tel, userData.getFaxPhoneNumber()); nbTel++; } if (nbTel == 0) { - tel.add(new InlineHTML(" ")); + tel.setVisible(false); } - for (String prop :userData.getProperties()) { - - String value = userData.getPropertieValue(prop); - if (isPhoneNumber(value)) { - HTMLPanel field = new HTMLPanel(""); - Anchor tel = new Anchor(); - tel.setStyleName("tel-link"); - tel.setText(value); - tel.setHref("tel:" + value); - field.add(tel); - - Anchor sms = new Anchor(); - sms.setHref("sms:" + value); - Image smsImg = new Image(resourcesContact.sms()); - sms.getElement().appendChild(smsImg.getElement()); - field.add(sms); - - container.add(field); - } else { - HTML field = new HTML(value); - field.setStylePrimaryName(prop); - container.add(field); + for (PropertyDTO prop :userData.getProperties()) { + String value = prop.getValue(); + if (value != null & !value.isEmpty()) { + if (isPhoneNumber(value)) { + HTMLPanel field = new HTMLPanel(""); + createPhoneFragment(field, value); + createSmsFragment(field, value); + container.add(field); + } else { + HTML field = new HTML(value); + field.setStylePrimaryName(prop.getKey()); + container.add(field); + } } } } + private void createPhoneFragment(HTMLPanel parent, String value) { + Anchor tel = new Anchor(); + tel.setStyleName("tel-link"); + tel.setHref("tel:" + value); + tel.getElement().setInnerHTML(resources.call().getText()); + SpanElement text = Document.get().createSpanElement(); + text.setInnerText(value); + tel.getElement().appendChild(text); + parent.add(tel); + } + private void createSmsFragment(HTMLPanel parent, String value) { + Anchor sms = new Anchor(); + sms.setStyleName("sms-link"); + sms.setHref("sms:" + value); + sms.getElement().setInnerHTML(resources.sms().getText()); + parent.add(sms); + } + private boolean isPhoneNumber(String value) { if (value == null) return false; value = value.replaceAll(" ", ""); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java index e966ee403..6ee45ca9b 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java @@ -33,9 +33,11 @@ import org.fusesource.restygwt.client.MethodCallback; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.documents.events.app.*; +import org.silverpeas.mobile.client.apps.documents.events.pages.navigation.GedItemPublishedEvent; import org.silverpeas.mobile.client.apps.documents.events.pages.navigation.GedItemsLoadedEvent; import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationAttachmentsLoadedEvent; import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationLoadedEvent; +import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationPublishedEvent; import org.silverpeas.mobile.client.apps.documents.pages.GedNavigationPage; import org.silverpeas.mobile.client.apps.documents.pages.PublicationPage; import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages; @@ -47,11 +49,12 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.common.app.App; +import org.silverpeas.mobile.client.common.event.ErrorEvent; import org.silverpeas.mobile.client.common.mobil.MobilUtils; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; import org.silverpeas.mobile.client.components.IframePage; -import org.silverpeas.mobile.client.components.PopinConfirmation; import org.silverpeas.mobile.client.components.PopinInformation; +import org.silverpeas.mobile.client.components.attachments.AttachmentsManager; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.BaseDTO; import org.silverpeas.mobile.shared.dto.ContentDTO; @@ -137,8 +140,6 @@ private void displayContent(final ContentDTO content) { NavigationAppInstanceChangedEvent event = new NavigationAppInstanceChangedEvent(data); appInstanceChanged(event); } else if (content.getType().equals(ContentsTypes.Attachment.toString())) { - final DocumentsApp app = this; - MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<AttachmentDTO>() { @Override @@ -172,6 +173,7 @@ public void onSuccess(final Method method, final AttachmentDTO attachement) { } } }; + action.attempt(); } } @@ -193,6 +195,7 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) { page.setPageTitle(event.getInstance().getLabel()); page.setInstanceId(event.getInstance().getId()); page.setTopicId(null); + page.setPersonnal(event.getInstance().getPersonnal()); page.show(); } } @@ -209,14 +212,15 @@ public void execute() { }); } else if (event.getContent().getType().equals(ContentsTypes.Publication.name()) || event.getContent().getType().equals(ContentsTypes.News.name()) || - event.getContent().getType().equals(ContentsTypes.Attachment.name()) || event.getContent().getType().equals(ContentsTypes.Folder.name())) { - loadAppInstance(event.getContent(), new Command() { - @Override - public void execute() { - startWithContent(event.getContent()); - } - }); + loadAppInstance(event.getContent(), new Command() { + @Override + public void execute() { + startWithContent(event.getContent()); + } + }); + } else if (event.getContent().getType().equals(ContentsTypes.Attachment.name())) { + AttachmentsManager.viewDocument(event.getContent().getId(), event.getContent().getRole()); } } @@ -237,12 +241,22 @@ public void attempt() { @Override public void onSuccess(final Method method, final List<BaseDTO> result) { super.onSuccess(method, result); - EventBus.getInstance().fireEvent(new GedItemsLoadedEvent(result, getApplicationInstance().getFolderSharing())); + + EventBus.getInstance().fireEvent(new GedItemsLoadedEvent(result, getApplicationInstance().getFolderSharing(), + getCanImport(), event.isForceReload())); } }; action.attempt(); } + private boolean getCanImport() { + if (getApplicationInstance().getRights() == null) return true; + //TODO : if writer manage validation and manage topic specific right + boolean canImport = getApplicationInstance().getRights().getManager() || + getApplicationInstance().getRights().getPublisher(); + return canImport; + } + /** * Get publication infos. */ @@ -264,8 +278,8 @@ public void onSuccess(final Method method, final PublicationDTO result) { EventBus.getInstance().fireEvent( new PublicationLoadedEvent(result, getApplicationInstance().getCommentable(), getApplicationInstance().getAbleToStoreContent(), - getApplicationInstance().getNotifiable(), getApplicationInstance().getPublicationSharing(), event.getContent().getType())); - + getApplicationInstance().getNotifiable(), getApplicationInstance().getPublicationSharing(), + event.getContent().getType(), getCanImport(), result.isPublishable())); } }; action.attempt(); @@ -310,4 +324,47 @@ public void onSuccess(Method method, TicketDTO dto) { }; action.attempt(); } + + @Override + public void nextPublication(DocumentsNextPublicationEvent event) { + ServicesLocator.getServiceDocuments().getNextPublication(event.getPublication().getInstanceId(), event.getPublication().getId(), event.getDirection(), new MethodCallback<PublicationDTO>() { + @Override + public void onFailure(Method method, Throwable throwable) { + EventBus.getInstance().fireEvent(new ErrorEvent(throwable)); + } + + @Override + public void onSuccess(Method method, PublicationDTO publicationDTO) { + PublicationPage page = new PublicationPage(); + page.setPageTitle(msg.publicationTitle()); + page.show(); + ContentDTO content = new ContentDTO(); + content.setId(publicationDTO.getId()); + content.setType(ContentsTypes.Publication.toString()); + EventBus.getInstance().fireEvent(new DocumentsLoadPublicationEvent(content)); + } + }); + } + + @Override + public void publish(DocumentsPublishEvent event) { + + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<PublicationDTO>() { + @Override + public void attempt() { + super.attempt(); + ServicesLocator.getServiceDocuments().publish(event.getPublication().getInstanceId(), + event.getPublication().getId(), this); + } + + @Override + public void onSuccess(Method method, PublicationDTO publication) { + super.onSuccess(method, publication); + EventBus.getInstance().fireEvent(new PublicationPublishedEvent(publication)); + //TODO : update folder + EventBus.getInstance().fireEvent(new GedItemPublishedEvent(event.getPublication())); + } + }; + action.attempt(); + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsAppEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsAppEventHandler.java index 178516db9..fb30682ce 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsAppEventHandler.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsAppEventHandler.java @@ -31,4 +31,8 @@ public interface DocumentsAppEventHandler extends EventHandler { void loadPublication(DocumentsLoadPublicationEvent event); void loadAttachments(DocumentsLoadAttachmentsEvent event); void share(DocumentsSharingEvent event); + + void nextPublication(DocumentsNextPublicationEvent event); + + void publish(DocumentsPublishEvent documentsPublishEvent); } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsLoadGedItemsEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsLoadGedItemsEvent.java index 143dcd0c1..cafc8efd8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsLoadGedItemsEvent.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsLoadGedItemsEvent.java @@ -28,6 +28,7 @@ public class DocumentsLoadGedItemsEvent extends AbstractDocumentsAppEvent { private String rootTopicId, instanceId; + private boolean forceReload = false; public DocumentsLoadGedItemsEvent(String instanceId, String rootTopicId) { super(); @@ -36,6 +37,14 @@ public DocumentsLoadGedItemsEvent(String instanceId, String rootTopicId) { this.instanceId = instanceId; } + public DocumentsLoadGedItemsEvent(String instanceId, String rootTopicId, boolean forceReload) { + super(); + if (rootTopicId == null) rootTopicId = "0"; + this.rootTopicId = rootTopicId; + this.instanceId = instanceId; + this.forceReload = forceReload; + } + @Override protected void dispatch(DocumentsAppEventHandler handler) { handler.loadTopics(this); @@ -48,4 +57,6 @@ public String getRootTopicId() { public String getInstanceId() { return instanceId; } + + public boolean isForceReload() { return forceReload; } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsNextPublicationEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsNextPublicationEvent.java new file mode 100644 index 000000000..82c4184e3 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsNextPublicationEvent.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.documents.events.app; + + +import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; + +public class DocumentsNextPublicationEvent extends AbstractDocumentsAppEvent { + + private PublicationDTO publication; + private String direction; + + public DocumentsNextPublicationEvent(PublicationDTO publication, String direction) { + super(); + this.publication = publication; + this.direction = direction; + } + @Override + protected void dispatch(DocumentsAppEventHandler handler) { + handler.nextPublication(this); + } + public PublicationDTO getPublication() { + return publication; + } + public String getDirection() { + return direction; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsPublishEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsPublishEvent.java new file mode 100644 index 000000000..ff7fae520 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsPublishEvent.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.documents.events.app; + + +import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; +import org.silverpeas.mobile.shared.dto.tickets.TicketDTO; + +public class DocumentsPublishEvent extends AbstractDocumentsAppEvent { + + private PublicationDTO publication; + + public DocumentsPublishEvent(PublicationDTO publication) { + super(); + this.publication = publication; + } + + @Override + protected void dispatch(DocumentsAppEventHandler handler) { + handler.publish(this); + } + + public PublicationDTO getPublication() { + return publication; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemPublishedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemPublishedEvent.java new file mode 100644 index 000000000..4c2d100d3 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemPublishedEvent.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.documents.events.pages.navigation; + +import org.silverpeas.mobile.shared.dto.BaseDTO; +import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; + +import java.util.List; + +public class GedItemPublishedEvent extends AbstractGedNavigationPagesEvent { + + + private PublicationDTO publication; + + public GedItemPublishedEvent(PublicationDTO publication) { + super(); + this.publication = publication; + } + + @Override + protected void dispatch(GedNavigationPagesEventHandler handler) { + handler.onPublicationPublished(this); + } + + public PublicationDTO getPublication() { + return publication; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemsLoadedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemsLoadedEvent.java index 4e0001af7..1715fd508 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemsLoadedEvent.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemsLoadedEvent.java @@ -31,13 +31,24 @@ public class GedItemsLoadedEvent extends AbstractGedNavigationPagesEvent { private List<BaseDTO> topicsAndPublications; + private boolean forceReload = false; private int sharing; + private boolean canImport = false; - public GedItemsLoadedEvent(List<BaseDTO> topicsAndPublications, int sharing) { + public GedItemsLoadedEvent(List<BaseDTO> topicsAndPublications, int sharing, boolean canImport) { super(); this.topicsAndPublications = topicsAndPublications; this.sharing = sharing; + this.canImport = canImport; + } + + public GedItemsLoadedEvent(List<BaseDTO> topicsAndPublications, int sharing, boolean canImport, boolean forceReload) { + super(); + this.topicsAndPublications = topicsAndPublications; + this.sharing = sharing; + this.canImport = canImport; + this.forceReload = forceReload; } @Override @@ -52,4 +63,8 @@ public List<BaseDTO> getTopicsAndPublications() { public int getSharing() { return sharing; } + + public boolean isForceReload() { return forceReload; } + + public boolean isCanImport() { return canImport; } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedNavigationPagesEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedNavigationPagesEventHandler.java index c7ae2fdc1..4d97b8ec5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedNavigationPagesEventHandler.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedNavigationPagesEventHandler.java @@ -29,4 +29,6 @@ public interface GedNavigationPagesEventHandler extends EventHandler { void onLoadedTopics(GedItemsLoadedEvent event); void onGedItemClicked(GedItemClickEvent event); + + void onPublicationPublished(GedItemPublishedEvent gedItemPublishedEvent); } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationLoadedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationLoadedEvent.java index b24522960..963792a8c 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationLoadedEvent.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationLoadedEvent.java @@ -33,7 +33,12 @@ public class PublicationLoadedEvent extends AbstractPublicationPagesEvent { private String type; private int sharing; - public PublicationLoadedEvent(PublicationDTO publication, boolean commentable, boolean ableToStoreContent, boolean notifiable, int sharing, String type) { + private boolean canImport = false; + + private boolean canPublish = false; + + public PublicationLoadedEvent(PublicationDTO publication, boolean commentable, boolean ableToStoreContent, + boolean notifiable, int sharing, String type, boolean canImport, boolean canPublish) { super(); this.notifiable = notifiable; this.publication = publication; @@ -41,6 +46,8 @@ public PublicationLoadedEvent(PublicationDTO publication, boolean commentable, b this.ableToStoreContent = ableToStoreContent; this.sharing = sharing; this.type = type; + this.canImport = canImport; + this.canPublish = canPublish; } @Override @@ -67,4 +74,10 @@ public boolean isNotifiable() { public String getType() { return type; } public int getSharing() { return sharing; } + + public boolean isCanImport() { return canImport; } + + public boolean isCanPublish() { + return canPublish; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationNavigationPagesEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationNavigationPagesEventHandler.java index 8994b5a6a..babbd5a0d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationNavigationPagesEventHandler.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationNavigationPagesEventHandler.java @@ -27,6 +27,9 @@ import com.google.gwt.event.shared.EventHandler; public interface PublicationNavigationPagesEventHandler extends EventHandler { - void onLoadedPublication(PublicationLoadedEvent event); - void onLoadedPublicationAttachments(PublicationAttachmentsLoadedEvent event); + void onLoadedPublication(PublicationLoadedEvent event); + + void onLoadedPublicationAttachments(PublicationAttachmentsLoadedEvent event); + + void publishedPublication(PublicationPublishedEvent publicationPublishedEvent); } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationPublishedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationPublishedEvent.java new file mode 100644 index 000000000..83bde6b3f --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationPublishedEvent.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.documents.events.pages.publication; + +import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; + +public class PublicationPublishedEvent extends AbstractPublicationPagesEvent { + + private PublicationDTO publication; + + public PublicationPublishedEvent(PublicationDTO publication) { + super(); + this.publication = publication; + } + + @Override + protected void dispatch(PublicationNavigationPagesEventHandler handler) { + handler.publishedPublication(this); + } + + public PublicationDTO getPublication() { + return publication; + } + + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.java index 1c359c042..75d8371b6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.java @@ -27,15 +27,12 @@ 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.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadGedItemsEvent; import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadPublicationEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.navigation - .AbstractGedNavigationPagesEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.navigation.GedItemClickEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.navigation.GedItemsLoadedEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.navigation - .GedNavigationPagesEventHandler; +import org.silverpeas.mobile.client.apps.documents.events.pages.navigation.*; +import org.silverpeas.mobile.client.apps.documents.pages.widgets.AddFileButton; import org.silverpeas.mobile.client.apps.documents.pages.widgets.GedItem; import org.silverpeas.mobile.client.apps.documents.pages.widgets.ShareButton; import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages; @@ -44,8 +41,8 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.app.View; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.BaseDTO; import org.silverpeas.mobile.shared.dto.ContentDTO; import org.silverpeas.mobile.shared.dto.ContentsTypes; @@ -58,23 +55,36 @@ public class GedNavigationPage extends PageContent implements View, GedNavigatio private DocumentsMessages msg; + @UiField HTMLPanel container; @UiField UnorderedList list; - @UiField ActionsMenu actionsMenu; private TopicDTO root; private String rootTopicId, instanceId; private boolean dataLoaded = false; - private AddToFavoritesButton favorite = new AddToFavoritesButton(); + private AddToFavoritesButton buttonFavorite = new AddToFavoritesButton(); + + private AddFileButton buttonImport = new AddFileButton(); private ShareButton share = new ShareButton(); + private boolean canImport = false; + private boolean personnal = false; + private static GedNavigationPageUiBinder uiBinder = GWT.create(GedNavigationPageUiBinder.class); + private ApplicationMessages globalMsg = GWT.create(ApplicationMessages.class); + + public void setPersonnal(boolean personnal) { + this.personnal = personnal; + } + interface GedNavigationPageUiBinder extends UiBinder<Widget, GedNavigationPage> { } public GedNavigationPage() { msg = GWT.create(DocumentsMessages.class); initWidget(uiBinder.createAndBindUi(this)); + container.getElement().setId("edm"); + buttonImport.setId("import"); EventBus.getInstance().addHandler(AbstractGedNavigationPagesEvent.TYPE, this); } @@ -90,19 +100,29 @@ public void setTopicId(String rootTopicId) { EventBus.getInstance().fireEvent(new DocumentsLoadGedItemsEvent(instanceId, rootTopicId)); } + private void setCanImport(boolean canImport) { + this.canImport = canImport; + } + public void setInstanceId(String instanceId) { this.instanceId = instanceId; } @Override public void onLoadedTopics(GedItemsLoadedEvent event) { - if (isVisible() && dataLoaded == false) { + if ((isVisible() && dataLoaded == false) || (isVisible() && event.isForceReload())) { + setCanImport(event.isCanImport()); Notification.activityStart(); list.clear(); List<BaseDTO> dataItems = event.getTopicsAndPublications(); for (Object dataItem : dataItems) { if (dataItem instanceof TopicDTO && ((TopicDTO) dataItem).isRoot()) { - setPageTitle(((TopicDTO) dataItem).getName()); + if (personnal) { + setPageTitle(globalMsg.myDocuments()); + } else { + setPageTitle(((TopicDTO) dataItem).getName()); + addActionMenu(buttonFavorite); + } root = (TopicDTO) dataItem; } else { GedItem item = new GedItem(); @@ -112,17 +132,21 @@ public void onLoadedTopics(GedItemsLoadedEvent event) { } dataLoaded = true; - actionsMenu.addAction(favorite); - if (root.getId() == null) { - favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), root.getName()); + buttonFavorite.init(instanceId, instanceId, ContentsTypes.Component.name(), root.getName()); + buttonImport.init(instanceId, "0", false); } else { - favorite.init(instanceId, root.getId(), ContentsTypes.Folder.name(), root.getName()); + buttonFavorite.init(instanceId, root.getId(), ContentsTypes.Folder.name(), root.getName()); + buttonImport.init(instanceId, rootTopicId, false); + } + + if (canImport) { + addActionShortcut(buttonImport); } if (event.getSharing() > 0) { share.init(event.getSharing(), instanceId, root.getId(),"Node", "",""); - actionsMenu.addAction(share); + addActionMenu(share); } Notification.activityStop(); @@ -137,6 +161,7 @@ public void onGedItemClicked(GedItemClickEvent event) { GedNavigationPage page = new GedNavigationPage(); page.setInstanceId(instanceId); page.setTopicId(((TopicDTO)event.getGedItem()).getId()); + page.setCanImport(canImport); page.show(); } else if (event.getGedItem() instanceof PublicationDTO) { PublicationPage page = new PublicationPage(); @@ -151,6 +176,19 @@ public void onGedItemClicked(GedItemClickEvent event) { } } + @Override + public void onPublicationPublished(GedItemPublishedEvent event) { + for (int i = 0; i < list.getCount(); i++) { + GedItem item = (GedItem) list.getWidget(i); + Object data = item.getData(); + if (data instanceof PublicationDTO) { + if (event.getPublication().getId().equals(((PublicationDTO) data).getId())) { + item.setPublicationName(event.getPublication().getName()); + } + } + } + } + public String getRootTopicId() { return rootTopicId; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.ui.xml index daa9b4ea4..5fbb6e601 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/GedNavigationPage.ui.xml @@ -28,8 +28,7 @@ xmlns:base="urn:import:org.silverpeas.mobile.client.components.base" xmlns:components="urn:import:org.silverpeas.mobile.client.components"> - <g:HTMLPanel styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> + <g:HTMLPanel ui:field="container" styleName="content"> <components:UnorderedList ui:field="list" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java index c7d0264a8..511fe0b3d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java @@ -25,40 +25,43 @@ package org.silverpeas.mobile.client.apps.documents.pages; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.dom.client.Element; -import com.google.gwt.dom.client.HeadingElement; -import com.google.gwt.dom.client.ParagraphElement; -import com.google.gwt.dom.client.Style; +import com.google.gwt.dom.client.*; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.comments.pages.widgets.CommentsButton; import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadAttachmentsEvent; import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadPublicationEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.publication.AbstractPublicationPagesEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationAttachmentsLoadedEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationLoadedEvent; -import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationNavigationPagesEventHandler; +import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsNextPublicationEvent; +import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsPublishEvent; +import org.silverpeas.mobile.client.apps.documents.events.pages.publication.*; +import org.silverpeas.mobile.client.apps.documents.pages.widgets.AddFileButton; +import org.silverpeas.mobile.client.apps.documents.pages.widgets.DraftOutButton; import org.silverpeas.mobile.client.apps.documents.pages.widgets.LinkedPublicationItem; import org.silverpeas.mobile.client.apps.documents.pages.widgets.ShareButton; import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages; import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton; import org.silverpeas.mobile.client.apps.notifications.pages.widgets.NotifyButton; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.Html5Utils; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.PublicationContentHelper; import org.silverpeas.mobile.client.common.app.View; +import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndEvent; +import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndHandler; +import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEvent; +import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeRecognizer; import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.components.UnorderedList; import org.silverpeas.mobile.client.components.attachments.Attachment; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.SpeakButton; import org.silverpeas.mobile.shared.dto.ContentDTO; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; @@ -66,15 +69,18 @@ import org.silverpeas.mobile.shared.dto.notifications.NotificationDTO; public class PublicationPage extends PageContent - implements View, PublicationNavigationPagesEventHandler { + implements View, PublicationNavigationPagesEventHandler, SwipeEndHandler { private static PublicationPageUiBinder uiBinder = GWT.create(PublicationPageUiBinder.class); private PublicationDTO publication; + private boolean notifiable; @UiField HeadingElement title; @UiField + FocusPanel supercontainer; + @UiField HTMLPanel container; @UiField UnorderedList attachments, linkedPublications; @@ -86,8 +92,6 @@ public class PublicationPage extends PageContent Anchor contentLink; @UiField DivElement content; - @UiField - ActionsMenu actionsMenu; @UiField(provided = true) protected DocumentsMessages msg; @@ -95,20 +99,47 @@ public class PublicationPage extends PageContent private NotifyButton notification = new NotifyButton(); private AddToFavoritesButton favorite = new AddToFavoritesButton(); + private SpeakButton speak = new SpeakButton(); + + private AddFileButton buttonImport = new AddFileButton(); + private DraftOutButton buttonDraftOut = new DraftOutButton(); private ShareButton share = new ShareButton(); private ContentDTO contentDTO = null; + private boolean canImport = false; + + private SwipeRecognizer swipeRecognizer; + @Override + public void onSwipeEnd(SwipeEndEvent event) { + if (!isVisible()) return; + String direction = ""; + if (event.getDirection() == SwipeEvent.DIRECTION.RIGHT_TO_LEFT) { + // next + direction = "right"; + } /*else if (event.getDirection() == SwipeEvent.DIRECTION.LEFT_TO_RIGHT) { + // previous + direction = "left"; + }*/ + if (!direction.isEmpty()) { + EventBus.getInstance().fireEvent(new DocumentsNextPublicationEvent(publication, direction)); + } + } interface PublicationPageUiBinder extends UiBinder<Widget, PublicationPage> {} public PublicationPage() { msg = GWT.create(DocumentsMessages.class); initWidget(uiBinder.createAndBindUi(this)); + supercontainer.getElement().setAttribute("style","min-height:100vh;"); container.getElement().setId("publication"); attachments.getElement().setId("attachments"); linkedPublications.getElement().setId("linkedPublications"); content.setId("content"); + buttonImport.setId("import"); + buttonDraftOut.setId("publish"); + content.getStyle().setDisplay(Style.Display.NONE); EventBus.getInstance().addHandler(AbstractPublicationPagesEvent.TYPE, this); + EventBus.getInstance().addHandler(SwipeEndEvent.getType(), this); } @Override @@ -116,12 +147,17 @@ public void stop() { super.stop(); comments.stop(); EventBus.getInstance().removeHandler(AbstractPublicationPagesEvent.TYPE, this); + EventBus.getInstance().removeHandler(SwipeEndEvent.getType(), this); } public void setContent(final ContentDTO content) { this.contentDTO = content; } + private void setCanImport(boolean canImport) { + this.canImport = canImport; + } + public void setPublicationId(String id, String type) { // send event to controler for retrieve pub infos Notification.activityStart(); @@ -134,42 +170,103 @@ public void setPublicationId(String id, String type) { @Override public void onLoadedPublication(PublicationLoadedEvent event) { + if (!isVisible()) return; Notification.activityStop(); + attachments.clear(); + setCanImport(event.isCanImport()); this.publication = event.getPublication(); + this.notifiable = event.isNotifiable(); display(event.isCommentable(), event.isAbleToStoreContent(), event.getType()); - actionsMenu.addAction(favorite); + addActionMenu(favorite); if (event.isNotifiable()) { - actionsMenu.addAction(notification); + addActionMenu(notification); } if (event.getSharing() > 0) { share.init(event.getSharing(), event.getPublication().getInstanceId(), event.getPublication().getId(), "Publication", "", ""); - actionsMenu.addAction(share); + addActionMenu(share); } + addSpeakingCapacity(); if (Boolean.parseBoolean(ResourcesManager.getParam("content.display.embedded")) && publication.getContent()) { PublicationContentHelper.showContent(publication.getId(), publication.getInstanceId(), content); + contentLink.setVisible(false); + } else { + contentLink.setVisible(publication.getContent()); + } + swipeRecognizer = new SwipeRecognizer(supercontainer); + + if (canImport) { + buttonImport.init(event.getPublication().getInstanceId(), event.getPublication().getId(), true); + addActionShortcut(buttonImport); + } + + if (publication.isDraft() && event.isCanPublish()) { + buttonDraftOut.setCallback(new Command() { + @Override + public void execute() { + EventBus.getInstance().fireEvent(new DocumentsPublishEvent(publication)); + } + }); + addActionMenu(buttonDraftOut); + } + } + + private void addSpeakingCapacity() { + if (Boolean.parseBoolean(ResourcesManager.getParam("speaking"))) { + speak.setCallback(new Command() { + @Override + public void execute() { + Element el = Document.get().getElementById("htmlContent"); + String mainText = ""; + if (el != null) { + IFrameElement c = IFrameElement.as(el); + mainText = c.getContentDocument().getBody().getInnerText().trim(); + } + String[] text = {publication.getName(), publication.getDescription(), mainText}; + Html5Utils.readText(text, speak.getEndCallback()); + } + }); + addActionShortcut(speak); } - contentLink.setVisible(publication.getContent()); } @Override public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEvent event) { + if (!isVisible()) return; for (SimpleDocumentDTO attachment : event.getAttachments()) { + if (!publication.getNotAllowedDownloads().isEmpty()) { + attachment.setDownloadable(true); + for (String idNotAllowed : publication.getNotAllowedDownloads()) { + if (idNotAllowed.equals(attachment.getId())) { + attachment.setDownloadable(false); + } + } + } else { + attachment.setDownloadable(true); + } Attachment a = new Attachment(); + a.setNotifiable(this.notifiable); a.setAttachment(attachment); a.setSharing(event.getShare()); attachments.add(a); } } + @Override + public void publishedPublication(PublicationPublishedEvent event) { + title.setInnerHTML(event.getPublication().getName()); + publication.setName(event.getPublication().getName()); + } + /** - * Refesh view informations. + * Refresh view informations. */ private void display(boolean commentable, boolean ableToStoreContent, String type) { if (isVisible()) { EventBus.getInstance().fireEvent(new DocumentsLoadAttachmentsEvent(publication.getId(), publication.getInstanceId())); + setPageTitle(publication.getName()); title.setInnerHTML(publication.getName()); desc.setInnerHTML(publication.getDescription()); @@ -227,19 +324,7 @@ protected void showContent(ClickEvent event) { public static void showWebPageContent(String pubId, String appId, String title) { PublicationContentHelper.showContent(pubId, appId, title); } - private static void showPublicationContent(String pubId, String appId, String title) { PublicationContentHelper.showContent(pubId, appId, title); } - - @Override - public void setVisible(final boolean visible) { - super.setVisible(visible); - Element iframeC = content.getElementsByTagName("iframe").getItem(0); - if (iframeC != null) { - // need to re display - iframeC.removeFromParent(); - PublicationContentHelper.showContent(publication.getId(), publication.getInstanceId(), content); - } - } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.ui.xml index e6a910b4d..313a3065e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.ui.xml @@ -30,20 +30,20 @@ xmlns:widgets="urn:import:org.silverpeas.mobile.client.apps.comments.pages.widgets"> <ui:with field='msg' type='org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages'/> - <g:HTMLPanel ui:field="container" styleName="content"> + <g:FocusPanel ui:field="supercontainer"> + <g:HTMLPanel ui:field="container" styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> - - <h2 ui:field="title" class="publiName"></h2> - <p ui:field="desc" class="publiDesc"></p> - <widgets:CommentsButton ui:field="comments" visible="false"/> - <div ui:field="content" style="display:none;"> - <g:Anchor ui:field="contentLink" styleName="ui-btn ui-btn-icon-right" text="{msg.content}"/> - </div> - <components:UnorderedList ui:field="attachments"/> - <components:UnorderedList ui:field="linkedPublications"/> - <p ui:field="creator" class="lastUpdate"></p> - <p ui:field="lastUpdate" class="lastUpdate"></p> - <p ui:field="nbViews" class="nbViews"></p> - </g:HTMLPanel> + <h2 ui:field="title" class="publiName"></h2> + <p ui:field="desc" class="publiDesc"></p> + <widgets:CommentsButton ui:field="comments" visible="false"/> + <div ui:field="content" style="display:none;"> + <g:Anchor ui:field="contentLink" styleName="ui-btn ui-btn-icon-right" text="{msg.content}"/> + </div> + <components:UnorderedList ui:field="attachments"/> + <components:UnorderedList ui:field="linkedPublications"/> + <p ui:field="creator" class="lastUpdate"></p> + <p ui:field="lastUpdate" class="lastUpdate"></p> + <p ui:field="nbViews" class="nbViews"></p> + </g:HTMLPanel> + </g:FocusPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/SharingPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/SharingPage.ui.xml index 3800a0584..64739b79e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/SharingPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/SharingPage.ui.xml @@ -31,8 +31,8 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages'/> <g:HTMLPanel ui:field="container" styleName="ui-content ui-body-a"> - <label id="validityLabel" style="label"><ui:safehtml from="{msg.validityLabel}"/></label> - <g:ListBox ui:field="validity"></g:ListBox> + <label id="validityLabel" class="field-label"><ui:safehtml from="{msg.validityLabel}"/></label> + <g:ListBox ui:field="validity" styleName="filter-list"></g:ListBox> <div id="endValidityLabel"><ui:safehtml from="{msg.endValidityLabel}"/></div> <g:TextBox ui:field="endValidity" visible="false"></g:TextBox> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.java new file mode 100644 index 000000000..4a5be2947 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.java @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.documents.pages.widgets; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.Style; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.FileUpload; +import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.SpMobil; +import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadGedItemsEvent; +import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadPublicationEvent; +import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages; +import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.Notification; +import org.silverpeas.mobile.client.common.navigation.UrlUtils; +import org.silverpeas.mobile.client.common.network.NetworkHelper; +import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.resources.ApplicationMessages; +import org.silverpeas.mobile.shared.dto.ContentDTO; +import org.silverpeas.mobile.shared.dto.ContentsTypes; + + +/** + * @author: svu + */ +public class AddFileButton extends ActionItem { + interface AddFileButtonUiBinder extends UiBinder<Widget, AddFileButton> { + } + + @UiField FileUpload file; + @UiField Anchor link; + @UiField(provided = true) protected DocumentsMessages msg = null; + + + private String instanceIdValue, locationIdValue; + private boolean locationIsPublication = false; + private ApplicationMessages globalMsg = GWT.create(ApplicationMessages.class); + + private static AddFileButtonUiBinder uiBinder = GWT.create(AddFileButtonUiBinder.class); + + public AddFileButton() { + msg = GWT.create(DocumentsMessages.class); + initWidget(uiBinder.createAndBindUi(this)); + file.getElement().setAttribute("accept", "*/*"); + file.getElement().setAttribute("multiple", "multiple"); + file.getElement().setAttribute("length", "40"); + file.getElement().getStyle().setDisplay(Style.Display.NONE); + } + + public void init(String instanceId, String locationId, boolean locationIsPublication) { + this.instanceIdValue = instanceId; + this.locationIdValue = locationId; + this.locationIsPublication = locationIsPublication; + } + + @UiHandler("file") + void upload(ChangeEvent event) { + Notification.activityStartImmediately(); + String url = UrlUtils.getUploadLocation(); + url += "FileAction"; + upload(this, file.getElement(), instanceIdValue, locationIdValue, locationIsPublication, url, SpMobil.getUserToken()); + } + + public void fileUploadedSuccessfully() { + if (locationIsPublication) { + ContentDTO content = new ContentDTO(); + content.setInstanceId(instanceIdValue); + content.setType(ContentsTypes.Publication.name()); + content.setContributionId(locationIdValue); + content.setId(locationIdValue); + EventBus.getInstance().fireEvent(new DocumentsLoadPublicationEvent(content)); + } else { + EventBus.getInstance().fireEvent(new DocumentsLoadGedItemsEvent(this.instanceIdValue, this.locationIdValue, true)); + } + } + + public void fileNotUploaded(int codeError) { + GWT.log("error " + codeError); + if (codeError == 413) { + Notification.alert(msg.maxUploadError()); + } else if (codeError == 415) { + Notification.alert(msg.fileNotSupportedError()); + } + Notification.activityStop(); + } + + @UiHandler("link") + void upload(ClickEvent event) { + if (NetworkHelper.isOnline()) { + clickOnInputFile(file.getElement()); + } else { + Notification.alert(globalMsg.needToBeOnline()); + } + } + + private static native void upload(AddFileButton button, Element input, String componentId, String locationId, boolean locationIsPublication, String url, String token) /*-{ + var xhr = new XMLHttpRequest(); + var fd = new FormData(); + xhr.open("POST", url, false); + xhr.setRequestHeader("X-Silverpeas-Session", token); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4 && xhr.status == 200) { + // Every thing ok, file uploaded + button.@org.silverpeas.mobile.client.apps.documents.pages.widgets.AddFileButton::fileUploadedSuccessfully()(); + } else { + button.@org.silverpeas.mobile.client.apps.documents.pages.widgets.AddFileButton::fileNotUploaded(I)(xhr.status); + } + }; + fd.append("componentId", componentId); + if (locationIsPublication) { + fd.append("publicationId", locationId); + } else { + fd.append("folderId", locationId); + } + for(var i = 0; i < input.files.length ; i++) { + fd.append("upload_file"+i, input.files[i]); + } + xhr.send(fd); + }-*/; + + private static native void clickOnInputFile(Element elem) /*-{ + elem.click(); + }-*/; + +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.ui.xml new file mode 100644 index 000000000..a00b67808 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.ui.xml @@ -0,0 +1,34 @@ +<!-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "https://www.silverpeas.org/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' + xmlns:g='urn:import:com.google.gwt.user.client.ui'> + + <ui:with field='msg' type='org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages'/> + + <g:HTMLPanel tag="li" styleName="add-file"> + <g:Anchor ui:field="link"/> + <g:FileUpload ui:field="file" title="{msg.importFile}" name="file"/> + </g:HTMLPanel> +</ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.java new file mode 100644 index 000000000..6edffd784 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.documents.pages.widgets; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.Style; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.FileUpload; +import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.SpMobil; +import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadGedItemsEvent; +import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadPublicationEvent; +import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages; +import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.Notification; +import org.silverpeas.mobile.client.common.navigation.UrlUtils; +import org.silverpeas.mobile.client.common.network.NetworkHelper; +import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; +import org.silverpeas.mobile.client.resources.ApplicationMessages; +import org.silverpeas.mobile.shared.dto.ContentDTO; +import org.silverpeas.mobile.shared.dto.ContentsTypes; + + +/** + * @author: svu + */ +public class DraftOutButton extends ActionItem { + interface DraftOutButtonUiBinder extends UiBinder<Widget, DraftOutButton> { + } + + @UiField Anchor link; + @UiField(provided = true) protected DocumentsMessages msg = null; + + private ApplicationMessages globalMsg = GWT.create(ApplicationMessages.class); + + private static DraftOutButtonUiBinder uiBinder = GWT.create(DraftOutButtonUiBinder.class); + + public DraftOutButton() { + msg = GWT.create(DocumentsMessages.class); + initWidget(uiBinder.createAndBindUi(this)); + } + + @UiHandler("link") + void upload(ClickEvent event) { + getCallback().execute(); + ActionsMenu.close(getElement()); + } +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.ui.xml new file mode 100644 index 000000000..13a16a33d --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.ui.xml @@ -0,0 +1,33 @@ +<!-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "https://www.silverpeas.org/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' + xmlns:g='urn:import:com.google.gwt.user.client.ui'> + + <ui:with field='msg' type='org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages'/> + + <g:HTMLPanel tag="li" ui:field="container" styleName=""> + <g:Anchor styleName="" ui:field="link" text="{msg.draftOut}"/> + </g:HTMLPanel> +</ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.java index cfeba6296..f1df845e6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.java @@ -31,10 +31,12 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.documents.events.pages.navigation.GedItemClickEvent; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.resources.ApplicationMessages; +import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; import org.silverpeas.mobile.shared.dto.documents.TopicDTO; @@ -45,8 +47,9 @@ public class GedItem extends Composite { private PublicationDTO dataPublication; private static GedItemUiBinder uiBinder = GWT.create(GedItemUiBinder.class); @UiField Anchor link; + @UiField InlineHTML icon; protected ApplicationMessages msg = null; - + private ApplicationResources resources = GWT.create(ApplicationResources.class); interface GedItemUiBinder extends UiBinder<Widget, GedItem> { } @@ -56,28 +59,46 @@ public GedItem() { msg = GWT.create(ApplicationMessages.class); } + public Object getData() { + return data; + } + public void setData(Object data) { this.data = data; if (data instanceof TopicDTO) { dataTopic = (TopicDTO) data; if (dataTopic.getId().equals("1")) { setStyleName("trash"); + icon.setHTML(resources.trash().getText()); link.setText(dataTopic.getName()); } else { setStyleName("folder-ged"); - link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")"); + icon.setHTML(resources.folder().getText()); } + link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")"); + link.setStyleName("ui-btn ui-btn-icon-right ui-icon-carat-r"); } else if (data instanceof PublicationDTO) { dataPublication = (PublicationDTO) data; link.setHTML(dataPublication.getName()); setStyleName("publication"); + icon.setHTML(resources.publication().getText()); if (dataPublication.getVignette() != null) { - String style = "background-image:url("+dataPublication.getVignette(); - style += ");background-position:5px 5px;background-size:20px 20px;"; + String style = "background:url("+dataPublication.getVignette(); + style += ") no-repeat;background-position:0.5em;background-size:24px 24px;"; link.getElement().setAttribute("style", style); + icon.setVisible(false); } + link.setStyleName("ui-btn ui-icon-carat-r"); + } + + } + + public void setPublicationName(String name) { + if (dataPublication != null) { + dataPublication.setName(name); + ((PublicationDTO) data).setName(name); + link.setHTML(name); } - link.setStyleName("ui-btn ui-btn-icon-right ui-icon-carat-r"); } @UiHandler("link") diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.ui.xml index ee58469a2..6759b89a0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/GedItem.ui.xml @@ -25,8 +25,7 @@ <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <g:HTMLPanel tag="li"> - + <g:InlineHTML ui:field="icon" styleName="icon-item"></g:InlineHTML> <g:Anchor ui:field="link"></g:Anchor> - </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/ShareButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/ShareButton.java index 9a90c6296..f19f6517b 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/ShareButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/ShareButton.java @@ -29,21 +29,13 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; -import org.fusesource.restygwt.client.Method; -import org.fusesource.restygwt.client.MethodCallback; -import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsSharingEvent; import org.silverpeas.mobile.client.apps.documents.pages.SharingPage; import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages; -import org.silverpeas.mobile.client.apps.notifications.NotificationsApp; -import org.silverpeas.mobile.client.apps.notifications.resources.NotificationsMessages; -import org.silverpeas.mobile.client.common.EventBus; -import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.components.base.ActionItem; -import org.silverpeas.mobile.shared.dto.tickets.TicketDTO; +import org.silverpeas.mobile.client.components.base.ActionsMenu; + /** * @author: svu @@ -84,7 +76,7 @@ void displaySharePage(ClickEvent event) { page.show(); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.java index c9d9f071c..4cbca0cb0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.java @@ -57,4 +57,11 @@ public interface DocumentsMessages extends Messages { SafeHtml usersLabel(); SafeHtml emailsLabel(); SafeHtml commentsLabel(); + + String importFile(); + String maxUploadError(); + + String fileNotSupportedError(); + + String draftOut(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.properties index f8fa54820..7d958d399 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.properties @@ -52,3 +52,9 @@ maxAccessLabel=Nombre maximum d accès usersLabel=Utilisateurs emailsLabel=Emails externes commentsLabel=Message complémentaire + +importFile=Importer un fichier +maxUploadError=Média trop volumineux +fileNotSupportedError=Format non pris en charge + +draftOut=Publier \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_en.properties index 32a2d2d19..5ff952de1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_en.properties @@ -51,4 +51,10 @@ endValidityLabel=End validity date maxAccessLabel=Max access number usersLabel=Users emailsLabel=Externals emails -commentsLabel=Additional message \ No newline at end of file +commentsLabel=Additional message + +importFile=File import +maxUploadError=Media too large +fileNotSupportedError=Unsupported format + +draftOut=Publish \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_fr.properties index f8fa54820..7d958d399 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages_fr.properties @@ -52,3 +52,9 @@ maxAccessLabel=Nombre maximum d accès usersLabel=Utilisateurs emailsLabel=Emails externes commentsLabel=Message complémentaire + +importFile=Importer un fichier +maxUploadError=Média trop volumineux +fileNotSupportedError=Format non pris en charge + +draftOut=Publier \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/excel.gif b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/excel.gif deleted file mode 100644 index 5065c302d..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/excel.gif and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/image.gif b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/image.gif deleted file mode 100644 index bdb614fce..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/image.gif and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/pdf.gif b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/pdf.gif deleted file mode 100644 index 39449953c..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/pdf.gif and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/powerpoint.gif b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/powerpoint.gif deleted file mode 100644 index 39e625459..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/powerpoint.gif and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/unknown.gif b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/unknown.gif deleted file mode 100644 index c7f5e8222..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/unknown.gif and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/word.gif b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/word.gif deleted file mode 100644 index 73fbc81b6..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/word.gif and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.java index d1ab27edd..9b991f3b1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.java @@ -44,7 +44,6 @@ import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.faq.CategoryDTO; @@ -57,8 +56,6 @@ public class FaqPage extends PageContent implements FaqPagesEventHandler { private static FaqPageUiBinder uiBinder = GWT.create(FaqPageUiBinder.class); @UiField(provided = true) protected FaqMessages msg = null; - @UiField - ActionsMenu actionsMenu; @UiField HTMLPanel container; @@ -95,7 +92,7 @@ public void stop() { @Override public void setApp(final App app) { super.setApp(app); - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(getApp().getApplicationInstance().getId(), getApp().getApplicationInstance().getId(), ContentsTypes.Component.name(), getPageTitle()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.ui.xml index ed5dfc873..333095600 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/faq/pages/FaqPage.ui.xml @@ -31,8 +31,7 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.faq.resources.FaqMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> - <div class="content-navigation"><g:ListBox ui:field="categories"/></div> + <div class="content-navigation"><g:ListBox ui:field="categories" stylePrimaryName="faq-categories"/></div> <components:UnorderedList ui:field="faqs" styleName="forms-list"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java index 15a73d7b5..873fecb0d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java @@ -25,13 +25,9 @@ package org.silverpeas.mobile.client.apps.favorites; import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; -import org.silverpeas.mobile.client.apps.favorites.events.app.AbstractFavoritesAppEvent; -import org.silverpeas.mobile.client.apps.favorites.events.app.AddFavoriteEvent; -import org.silverpeas.mobile.client.apps.favorites.events.app.FavoritesAppEventHandler; -import org.silverpeas.mobile.client.apps.favorites.events.app.FavoritesLoadEvent; -import org.silverpeas.mobile.client.apps.favorites.events.app.GotoAppEvent; +import org.silverpeas.mobile.client.apps.favorites.events.app.*; import org.silverpeas.mobile.client.apps.favorites.events.pages.FavoritesLoadedEvent; import org.silverpeas.mobile.client.apps.favorites.pages.FavoritesPage; import org.silverpeas.mobile.client.apps.navigation.events.app.external.AbstractNavigationEvent; @@ -39,17 +35,17 @@ import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationEventHandler; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationShowContentEvent; import org.silverpeas.mobile.client.common.EventBus; -import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.event.ErrorEvent; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.ContentsTypes; +import org.silverpeas.mobile.shared.dto.MyLinkCategoryDTO; import org.silverpeas.mobile.shared.dto.MyLinkDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; -import java.util.List; +import java.util.*; public class FavoritesApp extends App implements FavoritesAppEventHandler, NavigationEventHandler { @@ -73,23 +69,74 @@ public void stop() { @Override public void loadFavorites(final FavoritesLoadEvent event) { - MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<List<MyLinkDTO>>() { - @Override - public void onSuccess(final Method method, final List<MyLinkDTO> result) { - super.onSuccess(method, result); - EventBus.getInstance().fireEvent(new FavoritesLoadedEvent(result)); - } - @Override - public void attempt() { - super.attempt(); - ServicesLocator.getServiceMyLinks().getMyLinks(this); - } - }; - action.attempt(); + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<List<MyLinkCategoryDTO>>() { + @Override + public void attempt() { + super.attempt(); + ServicesLocator.getServiceMyLinks().getMyCategories(this); + } + + @Override + public void onSuccess(Method method, List<MyLinkCategoryDTO> categories) { + super.onSuccess(method, categories); + loadMyLinks(categories); + } + }; + action.attempt(); + } + private void loadMyLinks(List<MyLinkCategoryDTO> categories) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<List<MyLinkDTO>>() { + @Override + public void onSuccess(final Method method, final List<MyLinkDTO> links) { + super.onSuccess(method, links); + List groupedList = new ArrayList<>(); + List noCatList = new ArrayList<>(); + MyLinkCategoryDTO itemNoCat = new MyLinkCategoryDTO(); + itemNoCat.setName(msg.favoritesWithoutCategory()); + groupedList.add(itemNoCat); + for(MyLinkDTO link : links) { + if (link.getCategoryId() == null) { + noCatList.add(link); + } + } + Collections.sort(noCatList, new Comparator<MyLinkDTO>() { + @Override + public int compare(MyLinkDTO o1, MyLinkDTO o2) { + return o1.getPosition() - o2.getPosition(); + } + }); + groupedList.addAll(noCatList); + + for (MyLinkCategoryDTO category : categories) { + groupedList.add(category); + for(MyLinkDTO link : links) { + List catList = new ArrayList<>(); + if (link.getCategoryId() != null && link.getCategoryId().equals(category.getCatId())) { + catList.add(link); + } + Collections.sort(catList, new Comparator<MyLinkDTO>() { + @Override + public int compare(MyLinkDTO o1, MyLinkDTO o2) { + return o1.getPosition() - o2.getPosition(); + } + }); + groupedList.addAll(catList); + } + } + EventBus.getInstance().fireEvent(new FavoritesLoadedEvent(groupedList)); + } + + @Override + public void attempt() { + super.attempt(); + ServicesLocator.getServiceMyLinks().getMyLinks(this); + } + }; + action.attempt(); } - @Override + @Override public void addFavorite(final AddFavoriteEvent event) { MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<MyLinkDTO>() { @Override @@ -102,7 +149,11 @@ public void attempt() { super.attempt(); MyLinkDTO dto = new MyLinkDTO(); dto.setName(event.getDescription()); - dto.setUrl("/" + event.getObjectType() + "/" + event.getObjectId()); + if (event.getObjectType().equals(ContentsTypes.Folder.name())) { + dto.setUrl("/Topic/" + event.getObjectId() + "?ComponentId="+ event.getInstanceId()); + } else { + dto.setUrl("/" + event.getObjectType() + "/" + event.getObjectId()); + } dto.setVisible(true); dto.setPopup(false); dto.setDescription(event.getDescription()); @@ -139,7 +190,31 @@ public void onSuccess(final Method method, action.attempt(); } - @Override + @Override + public void deleteFavorites(FavoritesDeleteEvent favoritesDeleteEvent) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<Void>() { + private int i = 1; + @Override + public void attempt() { + super.attempt(); + for (MyLinkDTO dto : favoritesDeleteEvent.getSelection()) { + ServicesLocator.getServiceMyLinks().deleteLink(String.valueOf(dto.getLinkId()), this); + } + } + + @Override + public void onSuccess(Method method, Void unused) { + i++; + if (i > favoritesDeleteEvent.getSelection().size()) { + super.onSuccess(method, unused); + loadFavorites(new FavoritesLoadEvent()); + } + } + }; + action.attempt(); + } + + @Override public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { /* only one instance */ } @Override diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesAppEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesAppEventHandler.java index 115e37785..5220a5b59 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesAppEventHandler.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesAppEventHandler.java @@ -30,4 +30,5 @@ public interface FavoritesAppEventHandler extends EventHandler{ void loadFavorites(FavoritesLoadEvent event); void addFavorite(AddFavoriteEvent event); void gotoApp(GotoAppEvent event); + void deleteFavorites(FavoritesDeleteEvent favoritesDeleteEvent); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesDeleteEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesDeleteEvent.java new file mode 100644 index 000000000..01d8e3d5a --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesDeleteEvent.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.favorites.events.app; + + +import org.silverpeas.mobile.shared.dto.MyLinkDTO; + +import java.util.List; + +public class FavoritesDeleteEvent extends AbstractFavoritesAppEvent { + + private List<MyLinkDTO> selection; + public FavoritesDeleteEvent(){ + super(); + } + @Override + protected void dispatch(FavoritesAppEventHandler handler) { + handler.deleteFavorites(this); + } + + public void setSelection(List<MyLinkDTO> selection) { + this.selection = selection; + } + + public List<MyLinkDTO> getSelection() { + return selection; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/pages/FavoritesLoadedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/pages/FavoritesLoadedEvent.java index 79b85fbcd..627db28e3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/pages/FavoritesLoadedEvent.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/pages/FavoritesLoadedEvent.java @@ -24,15 +24,13 @@ package org.silverpeas.mobile.client.apps.favorites.events.pages; -import org.silverpeas.mobile.shared.dto.MyLinkDTO; - import java.util.List; public class FavoritesLoadedEvent extends AbstractFavoritesPagesEvent { - List<MyLinkDTO> favorites; + List favorites; - public FavoritesLoadedEvent(List<MyLinkDTO> favorites) { + public FavoritesLoadedEvent(List favorites) { super(); this.favorites = favorites; } @@ -42,7 +40,7 @@ protected void dispatch(FavoritesPagesEventHandler handler) { handler.onFavoritesLoaded(this); } - public List<MyLinkDTO> getFavorites() { + public List getFavorites() { return favorites; } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/FavoritesPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/FavoritesPage.java index 413e6ce74..8aeab4e2f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/FavoritesPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/FavoritesPage.java @@ -27,19 +27,27 @@ 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.Command; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.apps.favorites.events.app.FavoritesDeleteEvent; import org.silverpeas.mobile.client.apps.favorites.events.app.FavoritesLoadEvent; import org.silverpeas.mobile.client.apps.favorites.events.pages.AbstractFavoritesPagesEvent; import org.silverpeas.mobile.client.apps.favorites.events.pages.FavoritesLoadedEvent; import org.silverpeas.mobile.client.apps.favorites.events.pages.FavoritesPagesEventHandler; +import org.silverpeas.mobile.client.apps.favorites.pages.widgets.CategoryItem; +import org.silverpeas.mobile.client.apps.favorites.resources.FavoritesMessages; import org.silverpeas.mobile.client.apps.navigation.pages.widgets.FavoriteItem; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.components.PopinConfirmation; import org.silverpeas.mobile.client.components.UnorderedList; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.DeleteButton; import org.silverpeas.mobile.client.resources.ApplicationMessages; -import org.silverpeas.mobile.shared.dto.FavoriteDTO; +import org.silverpeas.mobile.shared.dto.MyLinkCategoryDTO; import org.silverpeas.mobile.shared.dto.MyLinkDTO; +import java.util.ArrayList; import java.util.List; public class FavoritesPage extends PageContent implements FavoritesPagesEventHandler { @@ -50,6 +58,10 @@ public class FavoritesPage extends PageContent implements FavoritesPagesEventHan @UiField UnorderedList favorites; + private DeleteButton buttonDelete = new DeleteButton(); + + private FavoritesMessages msgApp = GWT.create(FavoritesMessages .class); + interface FavoritesPageUiBinder extends UiBinder<Widget, FavoritesPage> { } @@ -69,12 +81,62 @@ public void stop() { @Override public void onFavoritesLoaded(final FavoritesLoadedEvent event) { + favorites.clear(); + List favoritesList = event.getFavorites(); + CategoryItem currentCategory = null; + for (Object it : favoritesList) { + if (it instanceof MyLinkDTO) { + FavoriteItem item = new FavoriteItem(); + item.setParent(this); + item.setData((MyLinkDTO) it); + currentCategory.addFavorite(item); + item.getElement().addClassName("item-open"); + favorites.add(item); + } else if (it instanceof MyLinkCategoryDTO) { + CategoryItem item = new CategoryItem(); + item.setData((MyLinkCategoryDTO) it); + favorites.add(item); + currentCategory = item; + } + } + } + + @Override + public void setSelectionMode(boolean selectionMode) { + super.setSelectionMode(selectionMode); + if (selectionMode) { + clearActions(); + buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedFavoris();}}); + buttonDelete.setId("delete-favoris"); + addActionShortcut(buttonDelete); + } else { + clearActions(); + } + } + + private void deleteSelectedFavoris() { + PopinConfirmation popin = new PopinConfirmation(msgApp.deleteConfirmation()); + popin.setYesCallback(new Command() { + @Override + public void execute() { + List<MyLinkDTO> selection = getSelectedFavorites(); + FavoritesDeleteEvent deleteEvent = new FavoritesDeleteEvent(); + deleteEvent.setSelection(selection); + if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent); + clearActions(); + } + }); + popin.show(); + } - List<MyLinkDTO> favoritesList = event.getFavorites(); - for (MyLinkDTO favoriteDTO : favoritesList) { - FavoriteItem item = new FavoriteItem(); - item.setData(favoriteDTO); - favorites.add(item); + private List<MyLinkDTO> getSelectedFavorites() { + List<MyLinkDTO> selection = new ArrayList<>(); + for (int i = 0; i < favorites.getCount(); i++) { + FavoriteItem item = (FavoriteItem) favorites.getWidget(i); + if (item.isSelected()) { + selection.add(item.getData()); + } } + return selection; } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/AddToFavoritesButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/AddToFavoritesButton.java index c95b6c201..b2a339141 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/AddToFavoritesButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/AddToFavoritesButton.java @@ -34,7 +34,9 @@ import org.silverpeas.mobile.client.apps.favorites.events.app.AddFavoriteEvent; import org.silverpeas.mobile.client.apps.favorites.resources.FavoritesMessages; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.components.Popin; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; /** * @author: svu @@ -75,7 +77,9 @@ void displayNotificationPage(ClickEvent event){ EventBus.getInstance().fireEvent(addEvent); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); + Popin popin = new Popin(msg.favoriteAdded()); + popin.show(); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.java new file mode 100644 index 000000000..d2231bbe7 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.favorites.pages.widgets; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.apps.navigation.pages.widgets.FavoriteItem; +import org.silverpeas.mobile.client.components.base.widgets.SelectableItem; +import org.silverpeas.mobile.client.resources.ApplicationMessages; +import org.silverpeas.mobile.client.resources.ApplicationResources; +import org.silverpeas.mobile.shared.dto.MyLinkCategoryDTO; + +import java.util.ArrayList; +import java.util.List; + +public class CategoryItem extends SelectableItem { + + private MyLinkCategoryDTO data; + private boolean expanded = true; + + private List<FavoriteItem> favorites = new ArrayList<>(); + private static CategoryItemUiBinder uiBinder = GWT.create(CategoryItemUiBinder.class); + + @UiField + HTMLPanel container; + @UiField Anchor link; + protected ApplicationMessages msg = null; + + private ApplicationResources resources = GWT.create(ApplicationResources.class); + + @UiField + SpanElement title, desc, icon; + + + interface CategoryItemUiBinder extends UiBinder<Widget, CategoryItem> { + } + + public CategoryItem() { + initWidget(uiBinder.createAndBindUi(this)); + msg = GWT.create(ApplicationMessages.class); + setContainer(container); + icon.setInnerHTML(resources.less().getText()); + + } + public void setData(MyLinkCategoryDTO data) { + this.data = data; + title.setInnerHTML(data.getName()); + if (!data.getName().equals(data.getDescription())) { + desc.setInnerHTML(data.getDescription()); + } + } + + public void addFavorite(FavoriteItem item) { + favorites.add(item); + } + + + public MyLinkCategoryDTO getData() { + return data; + } + + @UiHandler("link") + protected void onClick(ClickEvent event) { + expanded = !expanded; + if (expanded) { + icon.setInnerHTML(resources.less().getText()); + } else { + icon.setInnerHTML(resources.more().getText()); + } + for (FavoriteItem item : favorites) { + if (expanded) { + item.getElement().addClassName("item-open"); + item.getElement().removeClassName("item-closed"); + + } else { + item.getElement().addClassName("item-closed"); + item.getElement().removeClassName("item-open"); + } + } + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.ui.xml similarity index 77% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.ui.xml rename to mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.ui.xml index c9f8f3a0b..d5286d2cf 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.ui.xml @@ -23,10 +23,14 @@ --> <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> -<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> - <ui:with field='msg' type='org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages'/> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> + + <g:HTMLPanel tag="li" ui:field="container" styleName="category"> + <g:Anchor ui:field="link" styleName="ui-btn"> + <span ui:field="icon" class="category-icon"></span> + <span ui:field="title" class="category-title"></span> + <span ui:field="desc" class="category-desc"></span> + </g:Anchor> + </g:HTMLPanel> - <g:HTMLPanel tag="li" ui:field="container" styleName="add-task"> - <g:Anchor ui:field="link" styleName="ui-btn ui-btn-icon-right ui-icon-carat-more" text="{msg.create}"/> - </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.java index 6ae2fe4a6..721681946 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.java @@ -28,5 +28,8 @@ public interface FavoritesMessages extends Messages { String addToFavoritesContent(); + String favoriteAdded(); + + String deleteConfirmation(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.properties index c0196da5f..fb99e1826 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.properties @@ -23,3 +23,5 @@ # addToFavoritesContent=Ajouter en favoris +favoriteAdded=Favoris ajouté ! +deleteConfirmation=Etes-vous sur de supprimer ces favoris ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_en.properties index 3dbce1b1c..b7f87c2e8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_en.properties @@ -23,3 +23,5 @@ # addToFavoritesContent=Add to favorites +favoriteAdded=Favorite added ! +deleteConfirmation=Delete those favortis ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_fr.properties index c0196da5f..fb99e1826 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages_fr.properties @@ -23,3 +23,5 @@ # addToFavoritesContent=Ajouter en favoris +favoriteAdded=Favoris ajouté ! +deleteConfirmation=Etes-vous sur de supprimer ces favoris ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java index 5be0522f6..9a73bef1d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java @@ -50,9 +50,7 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.components.Popin; -import org.silverpeas.mobile.client.components.PopinInformation; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.client.components.forms.FieldEditable; import org.silverpeas.mobile.client.components.userselection.UserSelectionPage; @@ -75,8 +73,6 @@ public class FormOnlineEditPage extends PageContent implements UserSelectionComp private static List<FormFieldDTO> data; @UiField(provided = true) protected FormsOnlineMessages msg = null; - @UiField - ActionsMenu actionsMenu; @UiField UnorderedList fields; @@ -276,7 +272,11 @@ public static void showUserSelection(String fieldName, String type) { // get users or groups selected before TextAreaElement tx = getUserField(fieldName); List<String> ids = Arrays.asList(tx.getAttribute("data").split(",")); - page.setPreSelectedIds(ids); + if (type.equalsIgnoreCase("user")) { + page.setPreSelectedUsersIds(ids); + } else if (type.equalsIgnoreCase("group")) { + page.setPreSelectedGroupsIds(ids); + } sendEventToGetPossibleUsers(fieldName); page.show(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.ui.xml index d3814e9c0..a5bdf69a4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <components:UnorderedList ui:field="fields" styleName="formOnline-form"/> <g:HTML ui:field="layer"/> <div class=" ui-controlgroup ui-controlgroup-horizontal"> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.java index 143e3f277..226105281 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.java @@ -41,7 +41,6 @@ import org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.formsonline.FormRequestDTO; @@ -52,8 +51,6 @@ public class FormOnlineRequestsPage extends PageContent implements FormsOnlinePa private static FormsOnlineAsReceiverPageUiBinder uiBinder = GWT.create(FormsOnlineAsReceiverPageUiBinder.class); @UiField(provided = true) protected FormsOnlineMessages msg = null; - @UiField - ActionsMenu actionsMenu; @UiField UnorderedList requests; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.ui.xml index 2c0be6591..5bedecd02 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineRequestsPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <components:UnorderedList ui:field="requests" styleName="forms-list"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.java index a7d58c8ed..5dbda25f1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.java @@ -46,7 +46,6 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.client.components.forms.FieldViewable; import org.silverpeas.mobile.shared.dto.FormFieldDTO; @@ -60,9 +59,6 @@ public class FormOnlineViewPage extends PageContent implements FormsOnlinePagesE private boolean hasHtmlLayer; @UiField(provided = true) protected FormsOnlineMessages msg = null; - @UiField - ActionsMenu actionsMenu; - @UiField UnorderedList fields; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.ui.xml index 3e1e2edbc..d928592f2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineViewPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a formOnlineRequest"> - <base:ActionsMenu ui:field="actionsMenu"/> <components:UnorderedList ui:field="fields" styleName="formOnline-form"/> <g:HTML ui:field="layer"/> <g:Label ui:field="labelComment" text="{msg.comment}" styleName="label-comment"></g:Label> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.java index a26eb563d..733c10559 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.java @@ -40,7 +40,6 @@ import org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.formsonline.FormDTO; @@ -51,8 +50,6 @@ public class FormsOnlineAsReceiverPage extends PageContent implements FormsOnlin private static FormsOnlineAsReceiverPageUiBinder uiBinder = GWT.create(FormsOnlineAsReceiverPageUiBinder.class); @UiField(provided = true) protected FormsOnlineMessages msg = null; - @UiField - ActionsMenu actionsMenu; @UiField UnorderedList forms; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.ui.xml index af7124bac..0fe366ffa 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlineAsReceiverPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <components:UnorderedList ui:field="forms" styleName="forms-list"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java index 295eedcf7..68cac5991 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java @@ -49,7 +49,6 @@ import org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.formsonline.FormDTO; @@ -59,8 +58,6 @@ public class FormsOnlinePage extends PageContent implements FormsOnlinePagesEven private static FormsOnlinePageUiBinder uiBinder = GWT.create(FormsOnlinePageUiBinder.class); @UiField(provided = true) protected FormsOnlineMessages msg = null; - @UiField - ActionsMenu actionsMenu; @UiField HTMLPanel container; @@ -82,11 +79,11 @@ public void onFormsOnlineLoad(final FormsOnlineLoadedEvent event) { if (form.isReceiver()) canReceive = true; } - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(getApp().getApplicationInstance().getId(), getApp().getApplicationInstance().getId(), ContentsTypes.Component.name(), getPageTitle()); - actionsMenu.addAction(myRequests); + addActionMenu(myRequests); myRequests.init(getApp().getApplicationInstance().getId()); - if (canReceive) actionsMenu.addAction(requestsToValidate); + if (canReceive) addActionMenu(requestsToValidate); } @Override diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.ui.xml index af7124bac..0fe366ffa 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <components:UnorderedList ui:field="forms" styleName="forms-list"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewMyRequestsButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewMyRequestsButton.java index dd4d8e9fe..872de2f0f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewMyRequestsButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewMyRequestsButton.java @@ -31,11 +31,11 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; -import org.silverpeas.mobile.client.apps.favorites.events.app.AddFavoriteEvent; import org.silverpeas.mobile.client.apps.formsonline.events.app.FormOnlineMyRequestLoadEvent; import org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; /** * @author: svu @@ -68,7 +68,7 @@ void displayNotificationPage(ClickEvent event){ EventBus.getInstance().fireEvent(new FormOnlineMyRequestLoadEvent()); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewRequestsToValidateButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewRequestsToValidateButton.java index 0833a512c..51f370b55 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewRequestsToValidateButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewRequestsToValidateButton.java @@ -35,6 +35,7 @@ import org.silverpeas.mobile.client.apps.formsonline.resources.FormsOnlineMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; /** * @author: svu @@ -61,7 +62,7 @@ public ViewRequestsToValidateButton() { void displayNotificationPage(ClickEvent event){ EventBus.getInstance().fireEvent(new FormsOnlineAsReceiverLoadEvent()); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java index be4f2a28a..d4a061a0a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.client.apps.hyperlink; import org.fusesource.restygwt.client.Method; +import org.fusesource.restygwt.client.MethodCallback; import org.fusesource.restygwt.client.TextCallback; import org.silverpeas.mobile.client.apps.navigation.events.app.external.AbstractNavigationEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationAppInstanceChangedEvent; @@ -37,6 +38,7 @@ import org.silverpeas.mobile.client.common.event.ErrorEvent; import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.common.network.NetworkHelper; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.Apps; @@ -64,21 +66,21 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { if (event.getInstance().getType().equals(Apps.hyperlink.name())) { this.instance = event.getInstance(); - ServicesLocator.getServiceHyperLink().getUrl(instance.getId(), new TextCallback() { + ServicesLocator.getServiceHyperLink().getUrl(instance.getId(), new MethodCallback<HyperLinkDTO>() { @Override public void onFailure(final Method method, final Throwable t) { EventBus.getInstance().fireEvent(new ErrorEvent(t)); } @Override - public void onSuccess(final Method method, final String url) { - openLink(url); + public void onSuccess(Method method, HyperLinkDTO hyperLinkDTO) { + openLink(hyperLinkDTO); } }); } } - private void openLink(String url) { + private void openLink(HyperLinkDTO url) { Notification.activityStop(); NetworkHelper.hideOfflineIndicator(); LinksManager.processLink(url); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java index c9c280286..d49bc8367 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java @@ -26,6 +26,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.apps.media.events.app.AbstractMediaAppEvent; import org.silverpeas.mobile.client.apps.media.events.app.MediaAppEventHandler; @@ -96,35 +97,7 @@ public void start() { @Override public void startWithContent(final ContentDTO content) { - - MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { - @Override - public void attempt() { - super.attempt(); - ServicesLocator.getServiceNavigation() - .getApp(content.getInstanceId(), content.getId(), content.getType(), this); - } - - @Override - public void onFailure(final Method method, final Throwable t) { - super.onFailure(method, t); - if (NetworkHelper.needToGoOffine(t)) { - Notification.alert(globalMsg.needToBeOnline()); - } else { - EventBus.getInstance().fireEvent(new ErrorEvent(t)); - } - } - - @Override - public void onSuccess(final Method method, - final ApplicationInstanceDTO app) { - super.onSuccess(method, app); - commentable = app.getCommentable(); - notifiable = app.getNotifiable(); - displayContent(content); - } - }; - action.attempt(); + displayContent(content); } private void displayContent(ContentDTO contentSource) { @@ -133,13 +106,39 @@ private void displayContent(ContentDTO contentSource) { @Override public void attempt() { - ServicesLocator.getServiceMedia().getMedia(contentSource.getId(), this); + ServicesLocator.getServiceMedia().getMedia(contentSource.getInstanceId(), contentSource.getId(), this); } @Override public void onSuccess(final Method method, final MediaDTO media) { super.onSuccess(method, media); - displayContent(media); + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { + @Override + public void attempt() { + super.attempt(); + ServicesLocator.getServiceNavigation() + .getApp(media.getInstance(), media.getId(), contentSource.getType(), this); + } + @Override + public void onFailure(final Method method, final Throwable t) { + super.onFailure(method, t); + if (NetworkHelper.needToGoOffine(t)) { + Notification.alert(globalMsg.needToBeOnline()); + } else { + EventBus.getInstance().fireEvent(new ErrorEvent(t)); + } + } + + @Override + public void onSuccess(final Method method, + final ApplicationInstanceDTO app) { + super.onSuccess(method, app); + commentable = app.getCommentable(); + notifiable = app.getNotifiable(); + displayContent(media); + } + }; + action.attempt(); } }; action.attempt(); @@ -215,18 +214,36 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) { } } + private void loadAppInstance(final ContentDTO content) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { + @Override + public void attempt() { + ServicesLocator.getServiceNavigation() + .getApp(content.getInstanceId(), content.getId(), content.getType(), this); + } + @Override + public void onSuccess(final Method method, + final ApplicationInstanceDTO app) { + super.onSuccess(method, app); + setApplicationInstance(app); + appInstanceChanged(new NavigationAppInstanceChangedEvent(app)); + } + }; + action.attempt(); + } + @Override public void showContent(final NavigationShowContentEvent event) { if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.gallery.name())) { - super.showContent(event); + loadAppInstance(event.getContent()); } else if (event.getContent().getType().equals(ContentsTypes.Media.name()) || event.getContent().getType().equals(ContentsTypes.Photo.name()) || event.getContent().getType().equals(ContentsTypes.Sound.name()) || event.getContent().getType().equals(ContentsTypes.Video.name()) || event.getContent().getType().equals(ContentsTypes.Streaming.name())) { startWithContent(event.getContent()); - } else if (event.getContent().getType().equals(ContentsTypes.Album.name())) { - + } else if (event.getContent().getType().equals(ContentsTypes.Album.name()) || + event.getContent().getType().equals(ContentsTypes.Folder.name())) { MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { @Override public void attempt() { @@ -250,6 +267,7 @@ public void onSuccess(final Method method, page.show(); } }; + action.attempt(); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java index 11f9d9573..c6bef3e54 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java @@ -27,7 +27,10 @@ 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.ui.FlowPanel; +import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton; import org.silverpeas.mobile.client.apps.media.events.app.MediaViewShowEvent; import org.silverpeas.mobile.client.apps.media.events.app.MediasLoadMediaItemsEvent; @@ -42,19 +45,20 @@ import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.app.View; +import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; -import org.silverpeas.mobile.client.components.base.LoadingItem; -import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.*; import org.silverpeas.mobile.client.components.base.events.page.DataLoadedEvent; import org.silverpeas.mobile.client.components.base.events.page.LoadingDataFinishEvent; import org.silverpeas.mobile.client.components.base.events.page.MoreDataLoadedEvent; +import org.silverpeas.mobile.client.components.base.widgets.ShareButton; import org.silverpeas.mobile.shared.dto.BaseDTO; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.RightDTO; import org.silverpeas.mobile.shared.dto.media.AlbumDTO; import org.silverpeas.mobile.shared.dto.media.MediaDTO; +import java.util.ArrayList; import java.util.List; public class MediaNavigationPage extends PageContent implements View, MediaNavigationPagesEventHandler { @@ -63,12 +67,11 @@ public class MediaNavigationPage extends PageContent implements View, MediaNavig @UiField UnorderedList list; private AddMediaButton buttonImport = new AddMediaButton(); private LoadingItem endline = new LoadingItem(); - @UiField ActionsMenu actionsMenu; - private String rootAlbumId, instanceId; private RightDTO rights; private AlbumDTO root; private AddToFavoritesButton favorite = new AddToFavoritesButton(); + private ShareButton share = new ShareButton(); interface MediaNavigationPageUiBinder extends UiBinder<Widget, MediaNavigationPage> { } @@ -84,6 +87,7 @@ public void init(String instanceId, String rootAlbumId, RightDTO rights) { this.rootAlbumId = rootAlbumId; this.rights = rights; buttonImport.init(instanceId, rootAlbumId); + buttonImport.setId("import"); EventBus.getInstance().fireEvent(new MediasLoadMediaItemsEvent(instanceId, rootAlbumId)); } @@ -93,18 +97,22 @@ public void loadedDataEvent(final DataLoadedEvent event) { if (isVisible() && ((event.getLocationId() == null && rootAlbumId == null) || event.getLocationId().equals(rootAlbumId))) { list.clear(); if (rights.getWriter() || rights.getPublisher() || rights.getManager()) { - if (rootAlbumId != null) list.add(buttonImport); + if (rootAlbumId != null) { + addActionShortcut(buttonImport); + } } List<BaseDTO> dataItems = event.getData(); populateList(dataItems); list.add(endline); - - actionsMenu.addAction(favorite); if (root.getId() == null) { favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), root.getName()); + share.init(root.getName(), root.getName(), LinksManager.createApplicationPermalink(instanceId)); } else { favorite.init(instanceId, root.getId(), ContentsTypes.Album.name(), root.getName()); + share.init(root.getName(), root.getName(),LinksManager.createAlbumPermalink(instanceId, root.getId())); } + addActionMenu(favorite); + addActionMenu(share); } Notification.activityStop(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.ui.xml index daa9b4ea4..0dd747445 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.ui.xml @@ -29,7 +29,6 @@ xmlns:components="urn:import:org.silverpeas.mobile.client.components"> <g:HTMLPanel styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> - <components:UnorderedList ui:field="list" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> + <components:UnorderedList ui:field="list" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow medias"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.java index bb49a23b8..454b4fee8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.java @@ -38,10 +38,9 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.Image; import org.silverpeas.mobile.client.apps.comments.pages.widgets.CommentsButton; -import org.silverpeas.mobile.client.apps.documents.resources.DocumentsResources; import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton; import org.silverpeas.mobile.client.apps.media.events.app.MediaViewGetNextEvent; import org.silverpeas.mobile.client.apps.media.events.app.MediaViewGetPreviousEvent; @@ -57,12 +56,13 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.app.View; import org.silverpeas.mobile.client.common.navigation.UrlUtils; +import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndHandler; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeRecognizer; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.ShareButton; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.comments.CommentDTO; import org.silverpeas.mobile.shared.dto.media.PhotoDTO; @@ -77,7 +77,7 @@ interface PhotoPageUiBinder extends UiBinder<HTMLPanel, PhotoPage> { } @UiField HeadingElement mediaTitle; - @UiField Anchor mediaFullSize, download; + @UiField Anchor mediaFullSize, download, link; @UiField ParagraphElement lastUpdate, creator; @UiField SpanElement mediaFileName, weight, dimensions; @UiField ImageElement preview, mediaType; @@ -85,24 +85,28 @@ interface PhotoPageUiBinder extends UiBinder<HTMLPanel, PhotoPage> { CommentsButton comments; @UiField DivElement previewContainer; - @UiField ActionsMenu actionsMenu; + @UiField HTML view; + + @UiField HTMLPanel operations; private NotifyButton notification = new NotifyButton(); private AddToFavoritesButton favorite = new AddToFavoritesButton(); + private ShareButton share = new ShareButton(); + private static PhotoPageUiBinder uiBinder = GWT.create(PhotoPageUiBinder.class); private PhotoDTO photo; - private DocumentsResources ressources; private MediaMessages msg; private SwipeRecognizer swipeRecognizer; public PhotoPage() { initWidget(uiBinder.createAndBindUi(this)); - ressources = GWT.create(DocumentsResources.class); - ressources.css().ensureInjected(); msg = GWT.create(MediaMessages.class); EventBus.getInstance().addHandler(AbstractMediaPagesEvent.TYPE, this); getElement().setId("a-media"); + operations.getElement().setId("operations"); + download.getElement().setId("download"); + view.getElement().setId("view"); /*Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { @@ -139,9 +143,9 @@ public void onMediaViewPrev(final MediaViewPrevEvent mediaViewPrevEvent) { public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { if (isVisible()) { this.photo = (PhotoDTO) event.getPreview(); + if (!photo.getDownload()) link.getElement().removeClassName("expand-more"); preview.setSrc(photo.getDataPhoto()); - Image img = new Image(ressources.image()); - mediaType.getParentElement().replaceChild(img.getElement(), mediaType); + mediaType.setSrc(NetworkHelper.getContext() + "icons/files/file-type-image.svg"); mediaTitle.setInnerHTML(photo.getTitle()); mediaFileName.setInnerHTML(photo.getName()); @@ -167,11 +171,13 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { } favorite.init(photo.getInstance(), photo.getId(), ContentsTypes.Media.name(), photo.getTitle()); - actionsMenu.addAction(favorite); + addActionMenu(favorite); if (event.isNotifiable()) { notification.init(photo.getInstance(), photo.getId(), NotificationDTO.TYPE_PHOTO, photo.getName(), getPageTitle()); - actionsMenu.addAction(notification); + addActionMenu(notification); } + share.init(photo.getTitle(),photo.getTitle(),"/silverpeas/Media/"+photo.getId()); + addActionMenu(share); } } @@ -190,6 +196,28 @@ void showFullScreen(ClickEvent event) { page.show(); } + @UiHandler("link") + void link(ClickEvent event) { + if (photo.getDownload()) { + toogleOperations(); + } + } + + private void toogleOperations() { + if (operations.getStylePrimaryName().equalsIgnoreCase("ops-closed")) { + operations.setStylePrimaryName("ops-open"); + link.setStylePrimaryName("expand-less"); + } else { + operations.setStylePrimaryName("ops-closed"); + link.setStylePrimaryName("expand-more"); + } + } + + @UiHandler("view") + void view(ClickEvent event) { + showFullScreen(event); + } + @UiHandler("download") void download(ClickEvent event) { if (photo.getDownload()) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.ui.xml index 924a1d9a8..f03e39964 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.ui.xml @@ -28,8 +28,6 @@ xmlns:widgets="urn:import:org.silverpeas.mobile.client.apps.comments.pages.widgets"> <g:HTMLPanel styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> - <h2 class="mediaName" ui:field="mediaTitle"></h2> <div class="cadrePhoto" ui:field="previewContainer"> @@ -40,12 +38,20 @@ <widgets:CommentsButton ui:field="comments"/> <ul id="attachments"> <li> - <g:Anchor ui:field="download" styleName="downloadable"> - <img ui:field="mediaType"/> - <span ui:field="mediaFileName"></span> - <span class="weight" ui:field="weight"></span> - <span class="dimension" ui:field="dimensions"></span> + <g:Anchor ui:field="link" styleName="expand-more" href="javascript:;"> + <div> + <img ui:field="mediaType"/> + </div> + <div> + <span ui:field="mediaFileName"></span> + <span class="weight" ui:field="weight"></span> + <span class="dimension" ui:field="dimensions"></span> + </div> </g:Anchor> + <g:HTMLPanel ui:field="operations" stylePrimaryName="ops-closed"> + <g:Anchor ui:field="download" styleName="downloadable"></g:Anchor> + <g:HTML ui:field="view"></g:HTML> + </g:HTMLPanel> </li> </ul> <p ui:field="creator" class="lastUpdate"></p> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.java index 909c600bf..d34503720 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.java @@ -56,13 +56,15 @@ import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.app.View; +import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.common.navigation.UrlUtils; +import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndHandler; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeRecognizer; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.ShareButton; import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.comments.CommentDTO; @@ -79,16 +81,18 @@ interface SoundPageUiBinder extends UiBinder<HTMLPanel, SoundPage> { } @UiField HeadingElement mediaTitle; - @UiField Anchor mediaFullSize, download; + @UiField Anchor mediaFullSize, download, link; @UiField ParagraphElement lastUpdate, creator; @UiField SpanElement mediaFileName, weight, dimensions; @UiField ImageElement mediaPreview, mediaType; @UiField AudioElement player; @UiField CommentsButton comments; @UiField DivElement previewContainer; - @UiField ActionsMenu actionsMenu; + + @UiField HTMLPanel operations; private NotifyButton notification = new NotifyButton(); + private ShareButton share = new ShareButton(); private AddToFavoritesButton favorite = new AddToFavoritesButton(); private static SoundPageUiBinder uiBinder = GWT.create(SoundPageUiBinder.class); private ApplicationResources resources = GWT.create(ApplicationResources.class); @@ -100,6 +104,8 @@ public SoundPage() { initWidget(uiBinder.createAndBindUi(this)); msg = GWT.create(MediaMessages.class); getElement().setId("a-media"); + operations.getElement().setId("operations"); + download.getElement().setId("download"); EventBus.getInstance().addHandler(AbstractMediaPagesEvent.TYPE, this); /*Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override @@ -113,9 +119,9 @@ public void execute() { @Override public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { if (isVisible()) { - mediaPreview.setSrc(resources.sound().getSafeUri().asString()); SoundDTO sound = (SoundDTO) event.getPreview(); this.sound = sound; + if (!sound.getDownload()) link.getElement().removeClassName("expand-more"); String url = UrlUtils.getSilverpeasServicesLocation(); url += "gallery/" + sound.getInstance() + "/sounds/" + sound.getId() + "/content"; player.setSrc(url); @@ -125,8 +131,8 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { player.setAttribute("controlsList", "nodownload"); player.setAttribute("type", sound.getMimeType()); - Image img = new Image(resources.sound()); - mediaType.getParentElement().replaceChild(img.getElement(), mediaType); + mediaType.setSrc(NetworkHelper.getContext() + "icons/files/file-type-sound.svg"); + mediaTitle.setInnerHTML(sound.getTitle()); mediaFileName.setInnerHTML(sound.getName()); @@ -149,11 +155,30 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { comments.getElement().getStyle().setDisplay(Style.Display.NONE); } favorite.init(sound.getInstance(), sound.getId(), ContentsTypes.Media.name(), sound.getTitle()); - actionsMenu.addAction(favorite); + addActionMenu(favorite); if (event.isNotifiable()) { notification.init(sound.getInstance(), sound.getId(), NotificationDTO.TYPE_SOUND, sound.getName(), getPageTitle()); - actionsMenu.addAction(notification); + addActionMenu(notification); } + share.init(sound.getTitle(),sound.getTitle(), LinksManager.createMediaPermalink(sound.getId())); + addActionMenu(share); + } + } + + @UiHandler("link") + void link(ClickEvent event) { + if (sound.getDownload()) { + toogleOperations(); + } + } + + private void toogleOperations() { + if (operations.getStylePrimaryName().equalsIgnoreCase("ops-closed")) { + operations.setStylePrimaryName("ops-open"); + link.setStylePrimaryName("expand-less"); + } else { + operations.setStylePrimaryName("ops-closed"); + link.setStylePrimaryName("expand-more"); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml index 1b8932506..31ed372eb 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml @@ -28,24 +28,30 @@ xmlns:widgets="urn:import:org.silverpeas.mobile.client.apps.comments.pages.widgets"> <g:HTMLPanel styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="mediaName" ui:field="mediaTitle"></h2> <div class="cadrePhoto" ui:field="previewContainer"> <g:Anchor ui:field="mediaFullSize"> - <img ui:field="mediaPreview" src=""/> + <img ui:field="mediaPreview" src="/silverpeas/spmobile/icons/files/file-type-sound.svg" style="width:100%;"/> <audio ui:field="player"></audio> </g:Anchor> </div> <widgets:CommentsButton ui:field="comments"/> <ul id="attachments"> <li> - <g:Anchor ui:field="download" styleName="downloadable" href="#"> - <img ui:field="mediaType" src=""/> - <span ui:field="mediaFileName"></span> - <span class="weight" ui:field="weight"></span> - <span class="dimension" ui:field="dimensions"></span> + <g:Anchor ui:field="link" styleName="expand-more" href="javascript:;"> + <div> + <img ui:field="mediaType" src=""/> + </div> + <div> + <span ui:field="mediaFileName"></span> + <span class="weight" ui:field="weight"></span> + <span class="dimension" ui:field="dimensions"></span> + </div> </g:Anchor> + <g:HTMLPanel ui:field="operations" stylePrimaryName="ops-closed"> + <g:Anchor ui:field="download" styleName="downloadable"></g:Anchor> + </g:HTMLPanel> </li> </ul> <p ui:field="creator" class="lastUpdate"></p> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.java index 54e1dc3b1..588e853d2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.java @@ -41,6 +41,7 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Image; import org.silverpeas.mobile.client.apps.comments.pages.widgets.CommentsButton; @@ -59,13 +60,15 @@ import org.silverpeas.mobile.client.common.Html5Utils; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.app.View; +import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.common.navigation.UrlUtils; +import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndHandler; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeRecognizer; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.ShareButton; import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.comments.CommentDTO; @@ -82,16 +85,19 @@ interface VideoPageUiBinder extends UiBinder<HTMLPanel, VideoPage> { } @UiField HeadingElement mediaTitle; - @UiField Anchor mediaFullSize, download; + @UiField Anchor mediaFullSize, download, link; @UiField ParagraphElement lastUpdate, creator; @UiField SpanElement mediaFileName, weight, dimensions; @UiField ImageElement mediaType; @UiField CommentsButton comments; @UiField VideoElement player; @UiField DivElement previewContainer; - @UiField ActionsMenu actionsMenu; + + @UiField + HTMLPanel operations; private NotifyButton notification = new NotifyButton(); + private ShareButton shareBtn = new ShareButton(); private AddToFavoritesButton favorite = new AddToFavoritesButton(); private static VideoPageUiBinder uiBinder = GWT.create(VideoPageUiBinder.class); @@ -105,6 +111,10 @@ public VideoPage() { msg = GWT.create(MediaMessages.class); EventBus.getInstance().addHandler(AbstractMediaPagesEvent.TYPE, this); getElement().setId("a-media"); + + operations.getElement().setId("operations"); + download.getElement().setId("download"); + /*Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { @@ -118,6 +128,7 @@ public void execute() { public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { if (isVisible()) { this.video = (VideoDTO) event.getPreview(); + if (!video.getDownload()) link.getElement().removeClassName("expand-more"); String url = UrlUtils.getSilverpeasServicesLocation(); url += "gallery/" + video.getInstance() + "/videos/" + video.getId() + "/content"; player.setSrc(url); @@ -141,9 +152,7 @@ public void onClick(final ClickEvent clickEvent) { } } }); - - Image img = new Image(resources.video()); - mediaType.getParentElement().replaceChild(img.getElement(), mediaType); + mediaType.setSrc(NetworkHelper.getContext() + "icons/files/file-type-video.svg"); mediaTitle.setInnerHTML(video.getTitle()); mediaFileName.setInnerHTML(video.getName()); @@ -168,11 +177,30 @@ public void onClick(final ClickEvent clickEvent) { comments.getElement().getStyle().setDisplay(Style.Display.NONE); } favorite.init(video.getInstance(), video.getId(), ContentsTypes.Media.name(), video.getTitle()); - actionsMenu.addAction(favorite); + addActionMenu(favorite); if (event.isNotifiable()) { notification.init(video.getInstance(), video.getId(), NotificationDTO.TYPE_VIDEO, video.getName(), getPageTitle()); - actionsMenu.addAction(notification); + addActionMenu(notification); } + shareBtn.init(video.getTitle(),video.getTitle(), LinksManager.createMediaPermalink(video.getId())); + addActionMenu(shareBtn); + } + } + + @UiHandler("link") + void actions(ClickEvent event) { + if (video.getDownload()) { + toogleOperations(); + } + } + + private void toogleOperations() { + if (operations.getStylePrimaryName().equalsIgnoreCase("ops-closed")) { + operations.setStylePrimaryName("ops-open"); + link.setStylePrimaryName("expand-less"); + } else { + operations.setStylePrimaryName("ops-closed"); + link.setStylePrimaryName("expand-more"); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.ui.xml index ac68d9a1d..89d92f407 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.ui.xml @@ -28,7 +28,6 @@ xmlns:widgets="urn:import:org.silverpeas.mobile.client.apps.comments.pages.widgets"> <g:HTMLPanel styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="mediaName" ui:field="mediaTitle"></h2> <div class="cadrePhoto" ui:field="previewContainer"> @@ -39,12 +38,19 @@ <widgets:CommentsButton ui:field="comments"/> <ul id="attachments"> <li> - <g:Anchor ui:field="download" styleName="downloadable"> - <img ui:field="mediaType" src=""/> - <span ui:field="mediaFileName"></span> - <span class="weight" ui:field="weight"></span> - <span class="dimension" ui:field="dimensions"></span> + <g:Anchor ui:field="link" styleName="expand-more" href="javascript:;"> + <div> + <img ui:field="mediaType" src=""/> + </div> + <div> + <span ui:field="mediaFileName"></span> + <span class="weight" ui:field="weight"></span> + <span class="dimension" ui:field="dimensions"></span> + </div> </g:Anchor> + <g:HTMLPanel ui:field="operations" stylePrimaryName="ops-closed"> + <g:Anchor ui:field="download" styleName="downloadable"></g:Anchor> + </g:HTMLPanel> </li> </ul> <p ui:field="creator" class="lastUpdate"></p> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.java index 084074db2..23b9b1d5a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.java @@ -51,12 +51,14 @@ import org.silverpeas.mobile.client.apps.notifications.pages.widgets.NotifyButton; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.app.View; +import org.silverpeas.mobile.client.common.navigation.LinksManager; +import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndHandler; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEvent; import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeRecognizer; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.ShareButton; import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.comments.CommentDTO; @@ -81,10 +83,9 @@ interface VideoStreamingPageUiBinder extends UiBinder<HTMLPanel, VideoStreamingP CommentsButton comments; @UiField IFrameElement player; @UiField DivElement previewContainer; - @UiField - ActionsMenu actionsMenu; private NotifyButton notification = new NotifyButton(); + private ShareButton share = new ShareButton(); private AddToFavoritesButton favorite = new AddToFavoritesButton(); private static VideoStreamingPageUiBinder uiBinder = GWT.create(VideoStreamingPageUiBinder.class); private VideoStreamingDTO video; @@ -115,8 +116,7 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { player.setFrameBorder(0); player.setAttribute("allowfullscreen", ""); - Image img = new Image(resources.streaming()); - mediaType.getParentElement().replaceChild(img.getElement(), mediaType); + mediaType.setSrc(NetworkHelper.getContext() + "icons/files/file-type-video-ondemand.svg"); mediaTitle.setInnerHTML(video.getTitle()); mediaFileName.setInnerHTML(video.getName()); @@ -130,11 +130,13 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { comments.getElement().getStyle().setDisplay(Style.Display.NONE); } favorite.init(video.getInstance(), video.getId(), ContentsTypes.Media.name(), video.getTitle()); - actionsMenu.addAction(favorite); + addActionMenu(favorite); if (event.isNotifiable()) { notification.init(video.getInstance(), video.getId(), NotificationDTO.TYPE_STREAMING, video.getName(), getPageTitle()); - actionsMenu.addAction(notification); + addActionMenu(notification); } + share.init(video.getTitle(),video.getTitle(), LinksManager.createMediaPermalink(video.getId())); + addActionMenu(share); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.ui.xml index 3f3b513cc..c5de17aeb 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.ui.xml @@ -27,7 +27,6 @@ xmlns:base="urn:import:org.silverpeas.mobile.client.components.base" xmlns:widgets="urn:import:org.silverpeas.mobile.client.apps.comments.pages.widgets"> <g:HTMLPanel styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="mediaName" ui:field="mediaTitle"></h2> <div class="cadrePhoto" ui:field="previewContainer"> @@ -39,10 +38,14 @@ <ul id="attachments"> <li> <g:Anchor ui:field="download" styleName="downloadable"> - <img ui:field="mediaType" src=""/> - <span ui:field="mediaFileName"></span> - <span class="weight" ui:field="weight"></span> - <span class="dimension" ui:field="dimensions"></span> + <div> + <img ui:field="mediaType" src=""/> + </div> + <div> + <span ui:field="mediaFileName"></span> + <span class="weight" ui:field="weight"></span> + <span class="dimension" ui:field="dimensions"></span> + </div> </g:Anchor> </li> </ul> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java index 7aa2e16f0..3e6628271 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java @@ -32,9 +32,7 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FileUpload; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.SpMobil; @@ -44,14 +42,14 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.navigation.UrlUtils; import org.silverpeas.mobile.client.common.network.NetworkHelper; -import org.silverpeas.mobile.client.common.network.OfflineHelper; +import org.silverpeas.mobile.client.components.base.ActionItem; import org.silverpeas.mobile.client.resources.ApplicationMessages; /** * @author: svu */ -public class AddMediaButton extends Composite { +public class AddMediaButton extends ActionItem { interface AddMediaButtonUiBinder extends UiBinder<Widget, AddMediaButton> { } @@ -103,12 +101,11 @@ public void mediaNotUploaded(int codeError) { @UiHandler("link") void upload(ClickEvent event) { - if (!NetworkHelper.isOnline()) { + if (NetworkHelper.isOnline()) { clickOnInputFile(file.getElement()); } else { Notification.alert(globalMsg.needToBeOnline()); } - } private static native void upload(AddMediaButton button, Element input, String componentId, String albumId, String url, String token) /*-{ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.ui.xml index 6d6292185..827d18d91 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.ui.xml @@ -28,7 +28,7 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.media.resources.MediaMessages'/> <g:HTMLPanel tag="li" styleName="add-media"> - <g:Anchor ui:field="link" styleName="ui-btn ui-btn-icon-right ui-icon-carat-more" text="{msg.importMedia}"/> - <g:FileUpload ui:field="file" styleName="ui-btn ui-btn-icon-right ui-icon-carat-more" title="{msg.importMedia}" name="file"/> + <g:Anchor ui:field="link"/> + <g:FileUpload ui:field="file" title="{msg.importMedia}" name="file"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.java index ab01703c1..80d323cf0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.java @@ -31,17 +31,21 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.media.events.pages.navigation.MediaItemClickEvent; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.resources.ApplicationMessages; +import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.media.AlbumDTO; public class AlbumItem extends Composite { private AlbumDTO data; private static MediaItemUiBinder uiBinder = GWT.create(MediaItemUiBinder.class); + private ApplicationResources resources = GWT.create(ApplicationResources.class); @UiField Anchor link; + @UiField InlineHTML icon; protected ApplicationMessages msg = null; @@ -51,6 +55,7 @@ interface MediaItemUiBinder extends UiBinder<Widget, AlbumItem> { public AlbumItem() { initWidget(uiBinder.createAndBindUi(this)); msg = GWT.create(ApplicationMessages.class); + icon.setHTML(resources.mediaLib().getText()); } public void setData(AlbumDTO data) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.ui.xml index 73d9cb4d7..89fdce1e3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AlbumItem.ui.xml @@ -25,6 +25,7 @@ <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <g:HTMLPanel tag="li" styleName="folder-galery"> + <g:InlineHTML ui:field="icon" styleName="icon-item"></g:InlineHTML> <g:Anchor ui:field="link" styleName="ui-btn ui-btn-icon-right ui-icon-carat-r"></g:Anchor> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java index d0dea1c48..b25693017 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java @@ -37,7 +37,9 @@ import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.media.events.pages.navigation.MediaItemClickEvent; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.Html5Utils; import org.silverpeas.mobile.client.common.navigation.UrlUtils; +import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.media.MediaDTO; @@ -74,7 +76,8 @@ public void setData(MediaDTO data) { if (data instanceof PhotoDTO) { thumb.setSrc( ((PhotoDTO)data).getDataPhoto()); } else if (data instanceof SoundDTO) { - thumb.setSrc(resources.sound().getSafeUri().asString()); + thumb.setSrc(NetworkHelper.getContext() + "icons/files/file-type-sound.svg"); + thumb.setAttribute("style", "object-fit:unset;"); } else if (data instanceof VideoDTO) { String url = UrlUtils.getSilverpeasServicesLocation(); url += "gallery/" + ((VideoDTO) data).getInstance() + "/videos/" + ((VideoDTO) data).getId() + "/thumbnail/0"; @@ -82,7 +85,7 @@ public void setData(MediaDTO data) { } else if (data instanceof VideoStreamingDTO) { String url = ((VideoStreamingDTO) data).getUrlPoster(); if (url.isEmpty()) { - thumb.setSrc(resources.streaming().getSafeUri().asString()); + thumb.setSrc(NetworkHelper.getContext() + "icons/files/file-type-video-ondemand.svg"); } else { thumb.setSrc(url); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java index 941fc22b5..9e9bae28e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java @@ -26,6 +26,7 @@ import com.google.gwt.core.client.GWT; import org.fusesource.restygwt.client.Method; +import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.navigation.events.app.AbstractNavigationAppEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.LoadSpacesAndAppsEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.NavigationAppEventHandler; @@ -37,11 +38,14 @@ import org.silverpeas.mobile.client.apps.navigation.pages.NavigationPage; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.ServicesLocator; +import org.silverpeas.mobile.client.common.ShortCutRouter; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.HomePageDTO; +import org.silverpeas.mobile.shared.dto.navigation.HomePages; +import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO; public class NavigationApp extends App implements NavigationAppEventHandler,NavigationEventHandler { @@ -82,7 +86,7 @@ public void loadSpacesAndApps(final LoadSpacesAndAppsEvent event) { @Override public void attempt() { - ServicesLocator.getServiceNavigation().getHomePageData(event.getRootSpaceId(), this); + ServicesLocator.getServiceNavigation().getHomePageData(event.getRootSpaceId(), SpMobil.getContentZoomLevel(), this); } @Override @@ -100,10 +104,30 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { @Override public void showContent(final NavigationShowContentEvent event) { - if (event.getContent().getType().equals(ContentsTypes.Space.name())) { - NavigationPage page = new NavigationPage(); - page.setRootSpaceId(event.getContent().getId()); - page.show(); - } + if (event.getContent().getType().equals(ContentsTypes.Space.name())) { + final String id; + if (event.getContent().getInstanceId() == null || event.getContent().getInstanceId().isEmpty()) { + id = event.getContent().getId(); + } else { + id = event.getContent().getInstanceId(); + } + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<SpaceDTO>() { + @Override + public void attempt() { + ServicesLocator.getServiceNavigation().getSpace(id, this); + } + @Override + public void onSuccess(Method method, SpaceDTO space) { + if (space.getHomePageType() == HomePages.APP.getValue()) { + ShortCutRouter.route(SpMobil.getUser(), space.getHomePageParameter(), "Component", null, null, null); + } else { + NavigationPage page = new NavigationPage(); + page.setRootSpaceId(id); + page.show(); + } + } + }; + action.attempt(); + } } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.java index 8cc614826..dd5e8a69d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.java @@ -39,7 +39,6 @@ import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.ShortCutRouter; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.client.components.homepage.HomePageContent; import org.silverpeas.mobile.client.resources.ApplicationMessages; @@ -50,8 +49,6 @@ public class NavigationPage extends PageContent implements NavigationPagesEventHandler { - @UiField - ActionsMenu actionsMenu; private AddToFavoritesButton favorite = new AddToFavoritesButton(); @@ -87,7 +84,7 @@ public void homePageLoaded(HomePageLoadedEvent event) { dataLoaded = true; - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(null, event.getData().getId(), ContentsTypes.Space.name(), getPageTitle()); } Notification.activityStop(); @@ -109,6 +106,7 @@ public void stop() { @Override public void clickItem(ClickItemEvent event) { if (isVisible()) { + SpMobil.getMainPage().closeMenu(); if (event.getData() instanceof SpaceDTO) { SpaceDTO space = (SpaceDTO) event.getData(); if (space.getHomePageType() == HomePages.SILVERPEAS.getValue() || diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.ui.xml index 336bfe00b..c60d0c9d4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/NavigationPage.ui.xml @@ -29,7 +29,6 @@ xmlns:base="urn:import:org.silverpeas.mobile.client.components.base"> <g:HTMLPanel styleName="content"> - <base:ActionsMenu ui:field="actionsMenu"/> <homepage:HomePageContent ui:field="content"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java index 098d63234..a9a4d50b5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java @@ -25,24 +25,49 @@ package org.silverpeas.mobile.client.apps.navigation.pages.widgets; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.TouchEndEvent; +import com.google.gwt.event.dom.client.TouchMoveEvent; +import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.apps.notificationsbox.events.app.NotificationReadenEvent; +import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.navigation.LinksManager; +import org.silverpeas.mobile.client.components.base.widgets.SelectableItem; import org.silverpeas.mobile.client.resources.ApplicationMessages; +import org.silverpeas.mobile.client.resources.ApplicationResources; +import org.silverpeas.mobile.shared.dto.FavoriteDTO; import org.silverpeas.mobile.shared.dto.MyLinkDTO; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; +import org.silverpeas.mobile.shared.dto.notifications.NotificationReceivedDTO; +import org.silverpeas.mobile.shared.dto.notifications.NotificationSendedDTO; -public class FavoriteItem extends Composite { +public class FavoriteItem extends SelectableItem { private MyLinkDTO data; private static FavoriteItemUiBinder uiBinder = GWT.create(FavoriteItemUiBinder.class); + + @UiField + HTMLPanel container; @UiField Anchor link; protected ApplicationMessages msg = null; + private ApplicationResources resources = GWT.create(ApplicationResources.class); + + @UiField + SpanElement icon, title, desc; + + private boolean minimalView = true; interface FavoriteItemUiBinder extends UiBinder<Widget, FavoriteItem> { } @@ -50,11 +75,25 @@ interface FavoriteItemUiBinder extends UiBinder<Widget, FavoriteItem> { public FavoriteItem() { initWidget(uiBinder.createAndBindUi(this)); msg = GWT.create(ApplicationMessages.class); + icon.setInnerHTML(resources.favorite().getText()); + setContainer(container); + } + + public void setMinimalView(boolean minimalView) { + this.minimalView = minimalView; + if (minimalView) { + desc.getStyle().setDisplay(Style.Display.NONE); + } else { + desc.getStyle().setDisplay(Style.Display.BLOCK); + } } public void setData(MyLinkDTO data) { this.data = data; - link.setText(data.getName()); + title.setInnerHTML(data.getName()); + if (!data.getName().equals(data.getDescription())) { + desc.setInnerHTML(data.getDescription()); + } if(data.getUrl().startsWith("/")) { // internal link @@ -63,12 +102,32 @@ public void setData(MyLinkDTO data) { link.setHref(data.getUrl()); link.setTarget("_blank"); } - link.setStyleName("ui-btn ui-icon-carat-r"); + } + + public MyLinkDTO getData() { + return data; + } + + @UiHandler("link") + protected void startTouch(TouchStartEvent event) { + startTouch(event, minimalView); + } + + @UiHandler("link") + protected void moveTouch(TouchMoveEvent event) { + super.moveTouch(event); } @UiHandler("link") - protected void onClick(ClickEvent event) { - LinksManager.processLink(data.getUrl()); + protected void endTouch(TouchEndEvent event) { + endTouch(event, minimalView, new Command() { + @Override + public void execute() { + HyperLinkDTO link = new HyperLinkDTO(); + link.setUrl(data.getUrl()); + LinksManager.processLink(link); + } + }); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.ui.xml index ee58469a2..3a8b7afff 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.ui.xml @@ -24,9 +24,13 @@ <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> - <g:HTMLPanel tag="li"> - - <g:Anchor ui:field="link"></g:Anchor> - + + <g:HTMLPanel tag="li" ui:field="container" styleName="favorite"> + <g:Anchor ui:field="link" styleName="ui-btn"> + <span ui:field="icon" class="icon-app"></span> + <span ui:field="title" class="favorite-title"></span> + <span ui:field="desc" class="favorite-desc"></span> + </g:Anchor> </g:HTMLPanel> + </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.java index 5a7f7b79c..43b994ef3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.java @@ -31,10 +31,12 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.navigation.events.pages.ClickItemEvent; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.resources.ApplicationMessages; +import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.Apps; import org.silverpeas.mobile.shared.dto.navigation.SilverpeasObjectDTO; @@ -44,9 +46,11 @@ public class NavigationItem extends Composite { private SilverpeasObjectDTO data; private static NavigationItemUiBinder uiBinder = GWT.create(NavigationItemUiBinder.class); + private ApplicationResources resources = GWT.create(ApplicationResources.class); @UiField Anchor link; - protected ApplicationMessages msg = null; + @UiField InlineHTML icon; + protected ApplicationMessages msg = null; interface NavigationItemUiBinder extends UiBinder<Widget, NavigationItem> { } @@ -63,39 +67,54 @@ public void setData(SilverpeasObjectDTO data) { if (((SpaceDTO)data).isPersonal()) { link.setText(msg.personalSpace()); } + link.setStyleName("ui-btn ui-btn-icon-right ui-icon-carat-r"); } else { String type = ((ApplicationInstanceDTO) data).getType(); if (type.equalsIgnoreCase(Apps.kmelia.name())) { - setStyleName("folder-ged"); + setStyleName("app-ged"); + icon.setHTML(resources.ged().getText()); } else if (type.equalsIgnoreCase(Apps.gallery.name())) { - setStyleName("folder-galery"); + setStyleName("app-medialib"); + icon.setHTML(resources.mediaLib().getText()); } else if (type.equalsIgnoreCase(Apps.quickinfo.name())) { setStyleName("app-actuality"); + icon.setHTML(resources.news().getText()); } else if (type.equalsIgnoreCase(Apps.webPages.name())) { setStyleName("app-pageWeb"); + icon.setHTML(resources.webpage().getText()); } else if (type.equalsIgnoreCase(Apps.blog.name())) { setStyleName("app-blog"); + icon.setHTML(resources.blog().getText()); } else if (((ApplicationInstanceDTO) data).getWorkflow()) { setStyleName("app-workflow"); + icon.setHTML(resources.workflow().getText()); } else if (type.equalsIgnoreCase(Apps.hyperlink.name())) { setStyleName("app-link"); + icon.setHTML(resources.link().getText()); } else if (type.equalsIgnoreCase(Apps.almanach.name())) { setStyleName("app-almanach"); + icon.setHTML(resources.calendar().getText()); } else if (type.equalsIgnoreCase(Apps.formsOnline.name())) { setStyleName("app-formsOnline"); + icon.setHTML(resources.form().getText()); } else if (type.equalsIgnoreCase(Apps.classifieds.name())) { setStyleName("app-classifieds"); + icon.setHTML(resources.classifieds().getText()); } else if (type.equalsIgnoreCase(Apps.survey.name())) { setStyleName("app-survey"); + icon.setHTML(resources.quizz().getText()); } else if (type.equalsIgnoreCase(Apps.pollingStation.name())) { setStyleName("app-polling"); + icon.setHTML(resources.poll().getText()); } else if (type.equalsIgnoreCase(Apps.questionReply.name())) { setStyleName("app-faq"); + icon.setHTML(resources.faq().getText()); } else if (type.equalsIgnoreCase(Apps.resourcesManager.name())) { setStyleName("app-resourcesManager"); + icon.setHTML(resources.bookonline().getText()); } + link.setStyleName("ui-btn ui-icon-carat-r"); } - link.setStyleName("ui-btn ui-btn-icon-right ui-icon-carat-r"); } @UiHandler("link") diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.ui.xml index ee58469a2..1c98ed8d2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.ui.xml @@ -25,8 +25,7 @@ <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <g:HTMLPanel tag="li"> - + <g:InlineHTML ui:field="icon" styleName="icon-app"></g:InlineHTML> <g:Anchor ui:field="link"></g:Anchor> - </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java index cc255de5f..2c5e6c61f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java @@ -36,6 +36,7 @@ import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.ShortCutLinkDTO; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; public class ShortCutItem extends Composite { @@ -71,11 +72,13 @@ public void setData(ShortCutLinkDTO data) { @UiHandler("link") protected void onClick(ClickEvent event) { - LinksManager.processLink(data.getUrl()); + HyperLinkDTO link = new HyperLinkDTO(); + link.setUrl(data.getUrl()); + LinksManager.processLink(link); } public void setCssId(String id) { this.getElement().setId(id); } -} +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.ui.xml index c8b724e68..dc8d51092 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.ui.xml @@ -26,7 +26,7 @@ <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <g:HTMLPanel tag="li"> - <g:Image ui:field="icon" styleName="icon"></g:Image> + <g:Image ui:field="icon" styleName="icon-item"></g:Image> <g:Anchor ui:field="link"></g:Anchor> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java index bdd87828a..5eafb3130 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java @@ -40,6 +40,7 @@ import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; +import org.silverpeas.mobile.shared.dto.ContentDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.Apps; import org.silverpeas.mobile.shared.dto.news.NewsDTO; @@ -99,6 +100,25 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { } } + private void loadAppInstance(final ContentDTO content) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { + + @Override + public void attempt() { + ServicesLocator.getServiceNavigation() + .getApp(content.getInstanceId(), content.getId(), content.getType(), this); + } + + @Override + public void onSuccess(final Method method, + final ApplicationInstanceDTO app) { + super.onSuccess(method, app); + setApplicationInstance(app); + appInstanceChanged(new NavigationAppInstanceChangedEvent(app)); + } + }; + action.attempt(); + } @Override public void showContent(final NavigationShowContentEvent event) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.java index 8f795ff4f..aaef82434 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.java @@ -36,9 +36,10 @@ import org.silverpeas.mobile.client.apps.news.pages.widgets.NewsItem; import org.silverpeas.mobile.client.apps.news.resources.NewsMessages; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.ShareButton; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.news.NewsDTO; @@ -50,9 +51,9 @@ public class NewsPage extends PageContent implements NewsPagesEventHandler { @UiField(provided = true) protected NewsMessages msg = null; @UiField UnorderedList news; - @UiField ActionsMenu actionsMenu; private AddToFavoritesButton favorite = new AddToFavoritesButton(); + private ShareButton share = new ShareButton(); private String instanceId; interface NewsPageUiBinder extends UiBinder<Widget, NewsPage> { @@ -85,8 +86,10 @@ public void onNewsLoad(final NewsLoadedEvent event) { instanceId = newsDTO.getInstanceId(); i++; } - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), getPageTitle()); + addActionMenu(share); + share.init(getPageTitle(), getPageTitle(), LinksManager.createApplicationPermalink(instanceId)); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.ui.xml index df899cbef..bef70e6a6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.news.resources.NewsMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="appHeader"></h2> <components:UnorderedList ui:field="news" styleName="liste-news"/> </g:HTMLPanel> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.java index f82df83de..2fd00cac4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.java @@ -32,10 +32,7 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.TextArea; -import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.*; import org.silverpeas.mobile.client.apps.notifications.events.app.SendNotificationEvent; import org.silverpeas.mobile.client.apps.notifications.events.pages.AbstractNotificationPagesEvent; import org.silverpeas.mobile.client.apps.notifications.events.pages.NotificationPagesEventHandler; @@ -45,6 +42,7 @@ import org.silverpeas.mobile.client.common.app.View; import org.silverpeas.mobile.client.components.Popin; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.BaseDTO; import org.silverpeas.mobile.shared.dto.GroupDTO; import org.silverpeas.mobile.shared.dto.UserDTO; @@ -61,12 +59,15 @@ public class NotificationSenderPage extends PageContent implements View, Notific interface NotificationSenderPageUiBinder extends UiBinder<HTMLPanel, NotificationSenderPage> {} private static NotificationSenderPageUiBinder uiBinder = GWT.create(NotificationSenderPageUiBinder.class); + private ApplicationResources resources = GWT.create(ApplicationResources.class); @UiField protected HTMLPanel container; @UiField(provided = true) protected NotificationsMessages msg = null; - @UiField protected Anchor modify, send; + @UiField protected Anchor send; @UiField TextArea message; @UiField TextBox subject; + @UiField InlineHTML iconFile, iconSelection; + @UiField HTML destinataires; List<BaseDTO> selection = new ArrayList<BaseDTO>(); @@ -78,12 +79,13 @@ public NotificationSenderPage() { container.getElement().setId("edit-notification"); message.getElement().setId("message"); subject.getElement().setId("subject"); + iconFile.setHTML(resources.publication().getText()); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { - Element destinataires = Document.get().getElementById("destinataires"); + //Element destinataires = Document.get().getElementById("destinataires"); String dest = ""; @@ -97,8 +99,8 @@ public void execute() { dest = dest.substring(0, dest.length() - 2); dest += "<div id=\"nb-user-sectionne\" class=\"nb-user-sectionne\">"+"(" + selection.size() + ")"+"</div>"; - destinataires.setInnerHTML(dest); - + destinataires.setHTML(dest); + iconSelection.setHTML(resources.peoples().getText()); subject.setText(getTitle()); } } @@ -109,11 +111,6 @@ public void setSelection(List<BaseDTO> selection) { this.selection = selection; } - @UiHandler("modify") - protected void modify(ClickEvent event) { - back(); - } - @UiHandler("send") protected void sendNotification(ClickEvent event) { NotificationDTO notification = new NotificationDTO(message.getText()); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.ui.xml index b844c2d80..9c2e1a3ee 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.ui.xml @@ -33,13 +33,13 @@ <label for="subject"><ui:safehtml from="{msg.subject}"/></label> <div class="ui-input-text publication"> + <g:InlineHTML ui:field="iconFile" styleName="iconFile"/> <g:TextBox ui:field="subject"/> </div> <label for="subject"><ui:safehtml from="{msg.notifiedContacts}"/></label> <div id="destinataires" class="ui-input-text destinataires"> - <g:Anchor ui:field="modify" styleName="btn-modif"> - <ui:safehtml from="{msg.modify}"/> - </g:Anchor> + <g:InlineHTML ui:field="iconSelection"/> + <g:HTML ui:field="destinataires" /> </div> <label for="message"><ui:safehtml from="{msg.message}"/></label> <div id="champs-message"> @@ -48,8 +48,7 @@ </div> <div class=" ui-controlgroup ui-controlgroup-horizontal" > <div class="ui-controlgroup-controls "> - - <g:Anchor ui:field="send" styleName="btn-validate ui-link smaller"> + <g:Anchor ui:field="send" styleName="btn-validate ui-link"> <span class="ui-btn-text"><ui:safehtml from="{msg.send}"/></span> </g:Anchor> </div> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/widgets/NotifyButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/widgets/NotifyButton.java index 0c9a60d65..0de549556 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/widgets/NotifyButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/widgets/NotifyButton.java @@ -34,6 +34,7 @@ import org.silverpeas.mobile.client.apps.notifications.NotificationsApp; import org.silverpeas.mobile.client.apps.notifications.resources.NotificationsMessages; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; /** * @author: svu @@ -71,7 +72,7 @@ void displayNotificationPage(ClickEvent event){ app.start(); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java index 0f9b400a0..d7c28981e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.client.apps.notificationsbox; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.apps.navigation.events.app.external.AbstractNavigationEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationAppInstanceChangedEvent; @@ -133,7 +134,7 @@ public void attempt() { public void onSuccess(final Method method, final Void unused) { super.onSuccess(method, unused); if (event.getSelection().get(0) instanceof NotificationSendedDTO) { - loadNotificationsSended(new NotificationsSendedLoadEvent()); + loadNotificationsSended(new NotificationsSendedLoadEvent(), 0); } else { loadNotifications(new NotificationsLoadEvent(), 0); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.java index f28d115b6..426b9df10 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.java @@ -29,21 +29,25 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.apps.notificationsbox.events.app.DeleteNotificationsEvent; +import org.silverpeas.mobile.client.apps.notificationsbox.events.app.MarkAsReadNotificationsEvent; import org.silverpeas.mobile.client.apps.notificationsbox.events.app.NotificationsLoadEvent; import org.silverpeas.mobile.client.apps.notificationsbox.events.app.NotificationsSendedLoadEvent; import org.silverpeas.mobile.client.apps.notificationsbox.events.pages.AbstractNotificationsBoxPagesEvent; import org.silverpeas.mobile.client.apps.notificationsbox.events.pages.NotificationsBoxPagesEventHandler; import org.silverpeas.mobile.client.apps.notificationsbox.events.pages.NotificationsLoadedEvent; import org.silverpeas.mobile.client.apps.notificationsbox.events.pages.NotificationsSendedLoadedEvent; -import org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets.DeleteButton; import org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets.MarkAsReadButton; import org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets.NotificationItem; +import org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.components.PopinConfirmation; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.DeleteButton; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.notifications.NotificationBoxDTO; import org.silverpeas.mobile.shared.dto.notifications.NotificationReceivedDTO; @@ -63,11 +67,9 @@ public class NotificationsBoxPage extends PageContent implements NotificationsBo @UiField Anchor notificationReceived, notificationSended; - @UiField - ActionsMenu actionsMenu; - - private DeleteButton delete = new DeleteButton(); - private MarkAsReadButton notRead = new MarkAsReadButton(); + private NotificationsMessages msgApp = GWT.create(NotificationsMessages .class); + private DeleteButton buttonDelete = new DeleteButton(); + private MarkAsReadButton buttonNotRead = new MarkAsReadButton(); interface NotificationsBoxPageUiBinder extends UiBinder<Widget, NotificationsBoxPage> { } @@ -78,10 +80,8 @@ public NotificationsBoxPage() { initWidget(uiBinder.createAndBindUi(this)); EventBus.getInstance().addHandler(AbstractNotificationsBoxPagesEvent.TYPE, this); EventBus.getInstance().fireEvent(new NotificationsLoadEvent()); - delete.setParentPage(this); - notRead.setParentPage(this); - actionsMenu.addAction(delete); - actionsMenu.addAction(notRead); + buttonNotRead.setParentPage(this); + buttonDelete.setId("delete-notifications"); } @Override @@ -99,6 +99,7 @@ public void onNotificationsLoaded(final NotificationsLoadedEvent event) { for (NotificationReceivedDTO notif : notifs) { NotificationItem item = new NotificationItem(); item.setData(notif); + item.setParent(this); notifications.add(item); } } @@ -113,6 +114,7 @@ public void onNotificationsSendedLoaded( for (NotificationSendedDTO notif : notifs) { NotificationItem item = new NotificationItem(); item.setData(notif); + item.setParent(this); notifications.add(item); } } @@ -130,19 +132,57 @@ public List<NotificationBoxDTO> getSelectedNotification() { @UiHandler("notificationSended") protected void showSendedNotifications(ClickEvent event) { + setSelectionMode(false); notificationReceived.removeStyleName("ui-btn-active"); notificationSended.addStyleName("ui-btn-active"); - - notRead.setVisible(false); - + buttonNotRead.setVisible(false); EventBus.getInstance().fireEvent(new NotificationsSendedLoadEvent()); } @UiHandler("notificationReceived") protected void showReceivedNotifications(ClickEvent event) { + setSelectionMode(false); notificationSended.removeStyleName("ui-btn-active"); notificationReceived.addStyleName("ui-btn-active"); - notRead.setVisible(true); + buttonNotRead.setVisible(true); EventBus.getInstance().fireEvent(new NotificationsLoadEvent()); } + + @Override + public void setSelectionMode(boolean selectionMode) { + super.setSelectionMode(selectionMode); + if (selectionMode) { + clearActions(); + buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedNotifications();}}); + buttonNotRead.setCallback(new Command() {@Override public void execute() {markAsReadNotifications();}}); + addActionShortcut(buttonNotRead); + addActionShortcut(buttonDelete); + + } else { + clearActions(); + } + } + + private void markAsReadNotifications() { + List<NotificationBoxDTO> selection = getSelectedNotification(); + MarkAsReadNotificationsEvent notReadEvent = new MarkAsReadNotificationsEvent(); + notReadEvent.setSelection(selection); + EventBus.getInstance().fireEvent(notReadEvent); + clearActions(); + } + + private void deleteSelectedNotifications() { + PopinConfirmation popin = new PopinConfirmation(msgApp.deleteConfirmation()); + popin.setYesCallback(new Command() { + @Override + public void execute() { + List<NotificationBoxDTO> selection = getSelectedNotification(); + DeleteNotificationsEvent deleteEvent = new DeleteNotificationsEvent(); + deleteEvent.setSelection(selection); + if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent); + clearActions(); + } + }); + popin.show(); + } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.ui.xml index aae1d72b4..5a37c404e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.resources.ApplicationMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-body-a notificationBox"> - <base:ActionsMenu ui:field="actionsMenu"/> <div class="ui-corner-all ui-controlgroup ui-controlgroup-horizontal"> <div class="ui-controlgroup-controls "> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.java index cb75aadfa..b6fcdf8d1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.java @@ -36,6 +36,7 @@ import org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.shared.dto.notifications.NotificationBoxDTO; import java.util.List; @@ -54,7 +55,7 @@ interface NotReadButtonUiBinder extends UiBinder<HTMLPanel, MarkAsReadButton> {} @UiField HTMLPanel container; @UiField - Anchor read; + Anchor link; @UiField(provided = true) protected NotificationsMessages msg = null; @@ -66,16 +67,9 @@ public MarkAsReadButton() { setId("markAsRead"); } - @UiHandler("read") + @UiHandler("link") void read(ClickEvent event) { - List<NotificationBoxDTO> selection = parentPage.getSelectedNotification(); - - MarkAsReadNotificationsEvent notReadEvent = new MarkAsReadNotificationsEvent(); - notReadEvent.setSelection(selection); - EventBus.getInstance().fireEvent(notReadEvent); - - // hide menu - getElement().getParentElement().removeAttribute("style"); + getCallback().execute(); } public void setParentPage(final NotificationsBoxPage parentPage) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.ui.xml index a02e581fc..abcfc45c5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.ui.xml @@ -27,7 +27,7 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages'/> - <g:HTMLPanel tag="li" ui:field="container" styleName=""> - <g:Anchor styleName="" ui:field="read" text="{msg.markAsRead}"/> + <g:HTMLPanel tag="li" ui:field="container" styleName="markAsRead-notification"> + <g:Anchor ui:field="link"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.java index 0006fcfb6..2987d4376 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.java @@ -25,82 +25,92 @@ package org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Style; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.event.dom.client.TouchEndEvent; +import com.google.gwt.event.dom.client.TouchMoveEvent; +import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.CheckBox; -import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.notificationsbox.events.app.NotificationReadenEvent; import org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.components.base.widgets.SelectableItem; import org.silverpeas.mobile.shared.dto.notifications.NotificationBoxDTO; import org.silverpeas.mobile.shared.dto.notifications.NotificationReceivedDTO; import org.silverpeas.mobile.shared.dto.notifications.NotificationSendedDTO; -public class NotificationItem extends Composite implements ClickHandler { +public class NotificationItem extends SelectableItem { - private static ContactItemUiBinder uiBinder = GWT.create(ContactItemUiBinder.class); + private static NotificationItemUiBinder uiBinder = GWT.create(NotificationItemUiBinder.class); @UiField HTMLPanel container; @UiField - InlineHTML date, title, source, author; + SpanElement date, title, source, author; @UiField - CheckBox select; + Anchor link; @UiField(provided = true) protected NotificationsMessages msg = null; private NotificationBoxDTO data; - @Override - public void onClick(final ClickEvent clickEvent) { - if (data instanceof NotificationSendedDTO) { - Window.Location.assign(((NotificationSendedDTO)data).getLink()); - } else { - Window.Location.assign(((NotificationReceivedDTO)data).getLink()); - NotificationReadenEvent event = new NotificationReadenEvent((NotificationReceivedDTO) data); - EventBus.getInstance().fireEvent(event); - } - } - - interface ContactItemUiBinder extends UiBinder<Widget, NotificationItem> { + interface NotificationItemUiBinder extends UiBinder<Widget, NotificationItem> { } public NotificationItem() { msg = GWT.create(NotificationsMessages.class); initWidget(uiBinder.createAndBindUi(this)); - date.addClickHandler(this); - author.addClickHandler(this); - source.addClickHandler(this); - title.addClickHandler(this); + setContainer(container); + } + + @UiHandler("link") + protected void startTouch(TouchStartEvent event) { + startTouch(event, true); + } + + @UiHandler("link") + protected void moveTouch(TouchMoveEvent event) { + super.moveTouch(event); } - public boolean isSelected() { - return select.getValue(); + @UiHandler("link") + protected void endTouch(TouchEndEvent event) { + endTouch(event, true, new Command() { + @Override + public void execute() { + if (data instanceof NotificationSendedDTO) { + Window.Location.assign(((NotificationSendedDTO)data).getLink()); + } else { + Window.Location.assign(((NotificationReceivedDTO)data).getLink()); + NotificationReadenEvent event = new NotificationReadenEvent((NotificationReceivedDTO) data); + EventBus.getInstance().fireEvent(event); + } + } + }); } public void setData(NotificationSendedDTO data) { this.data = data; - date.setText(data.getDate()); - source.setText(data.getSource()); - title.setText(data.getTitle()); + date.setInnerText(data.getDate()); + source.setInnerHTML(data.getSource()); + title.setInnerHTML(data.getTitle()); } public void setData(NotificationReceivedDTO data) { this.data = data; - date.setText(data.getDate()); - author.setText(data.getAuthor()); - source.setText(data.getSource()); - title.setText(data.getTitle()); + date.setInnerText(data.getDate()); + author.setInnerText(data.getAuthor()); + source.setInnerText(data.getSource()); + title.setInnerHTML(data.getTitle()); if (data.getReaden() == 0) { - getElement().getStyle().setFontWeight(Style.FontWeight.BOLD); + getElement().addClassName("not-read"); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.ui.xml index 5b99b9a8a..5d9c6f737 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/NotificationItem.ui.xml @@ -27,11 +27,12 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages'/> <g:HTMLPanel tag="li" ui:field="container" styleName="notification"> - <g:CheckBox ui:field="select" styleName="notification-checkbox"></g:CheckBox> - <g:InlineHTML ui:field="title" styleName="notification-title"></g:InlineHTML> - <g:InlineHTML ui:field="date" styleName="notification-date"></g:InlineHTML> - <g:InlineHTML ui:field="author" styleName="notification-author"></g:InlineHTML> - <g:InlineHTML ui:field="source" styleName="notification-source"></g:InlineHTML> + <g:Anchor ui:field="link" styleName=""> + <span ui:field="title" class="notification-title"></span> + <span ui:field="date" class="notification-date"></span> + <span ui:field="author" class="notification-author"></span> + <span ui:field="source" class="notification-source"></span> + </g:Anchor> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.java index 4a94b9a81..2788052c3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.java @@ -31,4 +31,6 @@ public interface NotificationsMessages extends Messages { String delete(); String markAsRead(); + String deleteConfirmation(); + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.properties index c5880dea7..6efdad047 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages.properties @@ -25,3 +25,5 @@ delete=Supprimer la selection markAsRead=Marquer la selection comme lue +deleteConfirmation=Etes-vous sur de supprimer ces notifications ? + diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_en.properties index 7475e799f..e8a909713 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_en.properties @@ -23,4 +23,6 @@ # delete=Delete selection -markAsRead=Mark selection as read \ No newline at end of file +markAsRead=Mark selection as read + +deleteConfirmation=Delete those notifications ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_fr.properties index 46c35e9cc..23a79d757 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/resources/NotificationsMessages_fr.properties @@ -23,4 +23,6 @@ # delete=Supprimer la selection -markAsRead=Marquer la selection comme lue \ No newline at end of file +markAsRead=Marquer la selection comme lue + +deleteConfirmation=Etes-vous sur de supprimer ces notifications ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.java index 3ae04efd4..9a83b82fe 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.java @@ -25,15 +25,15 @@ package org.silverpeas.mobile.client.apps.profile.pages; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.PasswordTextBox; -import com.google.gwt.user.client.ui.TextArea; -import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.*; +import org.apache.ecs.html.Div; +import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.profile.ProfileApp; import org.silverpeas.mobile.client.apps.profile.events.ProfileEvents; import org.silverpeas.mobile.client.apps.profile.resources.ProfileMessages; @@ -53,6 +53,8 @@ public class ProfilePage extends PageContent { @UiField protected Anchor publish, changePwd; @UiField protected PasswordTextBox pwd1, pwd2; + @UiField protected DivElement changePwdArea; + interface StatusPageUiBinder extends UiBinder<Widget, ProfilePage> { } @@ -63,8 +65,11 @@ public ProfilePage() { container.getElement().setId("update-statut"); status.getElement().setAttribute("x-webkit-speech", "x-webkit-speech"); status.getElement().setAttribute("speech", "speech"); - pwd1.getElement().setAttribute("autocomplete", "off"); - pwd2.getElement().setAttribute("autocomplete", "off"); + pwd1.getElement().setAttribute("autocomplete", "new-password"); + pwd2.getElement().setAttribute("autocomplete", "new-password"); + if (!SpMobil.getUser().isLdap()) { + changePwdArea.getStyle().setDisplay(Style.Display.NONE); + } } @UiHandler("publish") diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.ui.xml index 4fdb4efbf..53b7b7ba4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/profile/pages/ProfilePage.ui.xml @@ -30,22 +30,6 @@ <g:HTMLPanel ui:field="container" styleName="ui-content ui-body-a"> - <h2><ui:safehtml from="{msg.titlePwd}"/></h2> - <div id="champs-password"> - <span class="ui-btn-text"><ui:text from="{msg.newPwd}"/></span> - <g:PasswordTextBox ui:field="pwd1" styleName="ui-input-text ui-body-inherit"/> - <br/> - <span class="ui-btn-text"><ui:text from="{msg.repeatNewPwd}"/></span> - <g:PasswordTextBox ui:field="pwd2" styleName="ui-input-text ui-body-inherit"/> - </div> - <div class=" ui-controlgroup ui-controlgroup-horizontal"> - <div class="ui-controlgroup-controls "> - <g:Anchor ui:field="changePwd" styleName="btn-validate ui-link"> - <span class="ui-btn-text"><ui:text from="{msg.changePwd}"/></span> - </g:Anchor> - </div> - </div> - <h2><ui:safehtml from="{msg.titleStatus}"/></h2> <div id="champs-statut"> <div class="ouverture-bulle"></div> @@ -58,6 +42,25 @@ </g:Anchor> </div> </div> + + <div ui:field="changePwdArea"> + <h2><ui:safehtml from="{msg.titlePwd}"/></h2> + <div id="champs-password"> + <span class="ui-btn-text"><ui:text from="{msg.newPwd}"/></span> + <g:PasswordTextBox ui:field="pwd1" styleName="ui-input-text ui-body-inherit"/> + <br/> + <span class="ui-btn-text"><ui:text from="{msg.repeatNewPwd}"/></span> + <g:PasswordTextBox ui:field="pwd2" styleName="ui-input-text ui-body-inherit"/> + </div> + <div class=" ui-controlgroup ui-controlgroup-horizontal"> + <div class="ui-controlgroup-controls "> + <g:Anchor ui:field="changePwd" styleName="btn-validate ui-link"> + <span class="ui-btn-text"><ui:text from="{msg.changePwd}"/></span> + </g:Anchor> + </div> + </div> + </div> + </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.java index c1604aeed..30e5dec56 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.java @@ -25,26 +25,18 @@ package org.silverpeas.mobile.client.apps.resourcesManager.pages; import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.TextArea; -import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; -import org.silverpeas.mobile.client.apps.resourcesManager.events.app.AddReservationEvent; import org.silverpeas.mobile.client.apps.resourcesManager.events.pages.AbstractResourcesManagerPagesEvent; import org.silverpeas.mobile.client.apps.resourcesManager.events.pages.DeletedReservationEvent; import org.silverpeas.mobile.client.apps.resourcesManager.events.pages.ResourcesManagerPagesEventHandler; import org.silverpeas.mobile.client.apps.resourcesManager.events.pages.SavedReservationEvent; -import org.silverpeas.mobile.client.apps.resourcesManager.pages.widgets.AddReservationButton; import org.silverpeas.mobile.client.apps.resourcesManager.pages.widgets.DeleteReservationButton; import org.silverpeas.mobile.client.apps.resourcesManager.resources.ResourcesManagerMessages; import org.silverpeas.mobile.client.common.EventBus; -import org.silverpeas.mobile.client.components.Popin; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.reservations.ReservationDTO; import org.silverpeas.mobile.shared.dto.reservations.ReservationStatus; @@ -59,9 +51,6 @@ public class ReservationDetailPage extends PageContent implements ResourcesManag private DeleteReservationButton deleteReservation = new DeleteReservationButton(); - @UiField - ActionsMenu actionsMenu; - @UiField(provided = true) protected ResourcesManagerMessages msg = null; @UiField @@ -86,7 +75,7 @@ public void setData(final ReservationDTO data) { html += "</ul>"; resources.setHTML(html); deleteReservation.setData(data); - actionsMenu.addAction(deleteReservation); + addActionMenu(deleteReservation); } @Override diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.ui.xml index 3beffd2f8..c18067c82 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ReservationDetailPage.ui.xml @@ -30,7 +30,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.resourcesManager.resources.ResourcesManagerMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <div id="reservationDetail" class="content-navigation"> <div class="section"> <g:Label ui:field="labelTitle" stylePrimaryName="field"><ui:text from="{msg.event}"/></g:Label> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.java index a50960584..bf40f3ee1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.java @@ -38,7 +38,6 @@ import org.silverpeas.mobile.client.apps.resourcesManager.resources.ResourcesManagerMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.reservations.ReservationDTO; @@ -51,9 +50,6 @@ public class ResourcesManagerPage extends PageContent implements ResourcesManage @UiField(provided = true) protected ResourcesManagerMessages msg = null; - @UiField - ActionsMenu actionsMenu; - @UiField UnorderedList reservations; @@ -94,9 +90,9 @@ public void setData(final List<ReservationDTO> reservationsDTO) { this.data = reservationsDTO; displayList(); - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(getApp().getApplicationInstance().getId(), getApp().getApplicationInstance().getId(), ContentsTypes.Component.name(), getPageTitle()); - actionsMenu.addAction(addReservation); + addActionMenu(addReservation); } private void displayList() { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.ui.xml index 3a952b2d7..35925bf24 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/ResourcesManagerPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.resourcesManager.resources.ResourcesManagerMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <div id="resourcesManager" class="content-navigation" style="min-height:100vh;"> <components:UnorderedList ui:field="reservations" styleName="list-reservations ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </div> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/AddReservationButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/AddReservationButton.java index 4dcb29c96..ee457bdd8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/AddReservationButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/AddReservationButton.java @@ -7,12 +7,10 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; -import org.silverpeas.mobile.client.apps.resourcesManager.events.app.AddReservationEvent; import org.silverpeas.mobile.client.apps.resourcesManager.pages.ReservationPage; -import org.silverpeas.mobile.client.apps.resourcesManager.pages.ResourcesManagerPage; import org.silverpeas.mobile.client.apps.resourcesManager.resources.ResourcesManagerMessages; -import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; /** * @author svu @@ -47,6 +45,6 @@ void displayReservationPage(ClickEvent event){ page.show(); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/DeleteReservationButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/DeleteReservationButton.java index 3a99c7ce7..fb5900942 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/DeleteReservationButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/resourcesManager/pages/widgets/DeleteReservationButton.java @@ -9,12 +9,11 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; import org.silverpeas.mobile.client.apps.resourcesManager.events.app.DeleteReservationEvent; -import org.silverpeas.mobile.client.apps.resourcesManager.pages.ReservationPage; import org.silverpeas.mobile.client.apps.resourcesManager.resources.ResourcesManagerMessages; import org.silverpeas.mobile.client.common.EventBus; -import org.silverpeas.mobile.client.components.Popin; import org.silverpeas.mobile.client.components.PopinConfirmation; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.shared.dto.reservations.ReservationDTO; /** @@ -61,6 +60,6 @@ public void execute() { conf.show(); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/SharesBoxApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/SharesBoxApp.java index dfd53842e..7c8f87b58 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/SharesBoxApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/SharesBoxApp.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.client.apps.sharesbox; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.apps.navigation.events.app.external.AbstractNavigationEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationAppInstanceChangedEvent; @@ -36,6 +37,7 @@ import org.silverpeas.mobile.client.apps.sharesbox.events.pages.SharesDeletedEvent; import org.silverpeas.mobile.client.apps.sharesbox.pages.SharesBoxPage; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; @@ -73,7 +75,7 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { @Override public void showContent(final NavigationShowContentEvent event) { - if (event.getContent().getType().equals(ContentsTypes.SharesBox.toString())) { + if (event.getContent().getType().equals(ContentsTypes. SharesBox.toString())) { MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<List<TicketDTO>>() { @Override public void attempt() { @@ -81,6 +83,14 @@ public void attempt() { ServicesLocator.getRestServiceTickets().getMyTickets("", this); } + @Override + public void onFailure(Method method, Throwable t) { + SharesBoxPage page = new SharesBoxPage(); + setMainPage(page); + page.show(); + Notification.activityStop(); + } + @Override public void onSuccess(Method method, List<TicketDTO> ticketDTOS) { super.onSuccess(method, ticketDTOS); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.java index 4b44a5ba0..cbec0f486 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.java @@ -27,17 +27,19 @@ 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.Command; import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.apps.sharesbox.events.app.DeleteSharesEvent; import org.silverpeas.mobile.client.apps.sharesbox.events.pages.AbstractSharesBoxPagesEvent; import org.silverpeas.mobile.client.apps.sharesbox.events.pages.SharesBoxPagesEventHandler; import org.silverpeas.mobile.client.apps.sharesbox.events.pages.SharesDeletedEvent; -import org.silverpeas.mobile.client.apps.sharesbox.pages.widgets.DeleteButton; import org.silverpeas.mobile.client.apps.sharesbox.pages.widgets.ShareItem; import org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.components.PopinConfirmation; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.DeleteButton; import org.silverpeas.mobile.shared.dto.tickets.TicketDTO; import java.util.ArrayList; @@ -51,18 +53,16 @@ public class SharesBoxPage extends PageContent implements SharesBoxPagesEventHan @UiField(provided = true) protected ShareMessages msg = null; @UiField UnorderedList shares; - - @UiField - ActionsMenu actionsMenu; private List<TicketDTO> data; - private DeleteButton delete = new DeleteButton(); + private DeleteButton buttonDelete = new DeleteButton(); public void setData(List<TicketDTO> data) { this.data = data; for (TicketDTO d : data) { ShareItem item = new ShareItem(); item.setData(d); + item.setParent(this); shares.add(item); } } @@ -98,10 +98,35 @@ public SharesBoxPage() { msg = GWT.create(ShareMessages.class); setPageTitle(msg.title()); initWidget(uiBinder.createAndBindUi(this)); - shares.getElement().setId("shares"); EventBus.getInstance().addHandler(AbstractSharesBoxPagesEvent.TYPE, this); - delete.setParentPage(this); - actionsMenu.addAction(delete); + buttonDelete.setId("delete-share"); + } + + @Override + public void setSelectionMode(boolean selectionMode) { + super.setSelectionMode(selectionMode); + if (selectionMode) { + clearActions(); + buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedShares();}}); + addActionShortcut(buttonDelete); + + } else { + clearActions(); + } + } + + private void deleteSelectedShares() { + PopinConfirmation popin = new PopinConfirmation(msg.deleteConfirmation()); //TODO + popin.setYesCallback(new Command() { + @Override + public void execute() { + List<TicketDTO> selection = getSelectedShares(); + DeleteSharesEvent deleteEvent = new DeleteSharesEvent(); + deleteEvent.setSelection(selection); + if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent); + } + }); + popin.show(); } @Override diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.ui.xml index 3e569dc80..892bd70af 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.ui.xml @@ -30,9 +30,8 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages' /> - <g:HTMLPanel ui:field="container" styleName="content ui-body-a notificationBox"> - <base:ActionsMenu ui:field="actionsMenu"/> + <g:HTMLPanel ui:field="container" styleName="content ui-body-a sharesbox"> - <components:UnorderedList ui:field="shares" stylePrimaryName="ui-listview ui-listview-inset ui-corner-all ui-shadow"></components:UnorderedList> + <components:UnorderedList ui:field="shares" stylePrimaryName="ui-listview ui-listview-inset ui-corner-all ui-shadow shares"></components:UnorderedList> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.java index 254038a31..9a265b9d9 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.java @@ -25,52 +25,75 @@ package org.silverpeas.mobile.client.apps.sharesbox.pages.widgets; 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.dom.client.AnchorElement; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.event.dom.client.TouchEndEvent; +import com.google.gwt.event.dom.client.TouchMoveEvent; +import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.ui.*; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.apps.notificationsbox.events.app.NotificationReadenEvent; import org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages; +import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.components.base.widgets.SelectableItem; +import org.silverpeas.mobile.shared.dto.notifications.NotificationReceivedDTO; +import org.silverpeas.mobile.shared.dto.notifications.NotificationSendedDTO; import org.silverpeas.mobile.shared.dto.tickets.TicketDTO; import java.util.Date; -public class ShareItem extends Composite implements ClickHandler { +public class ShareItem extends SelectableItem { private static ShareItemUiBinder uiBinder = GWT.create(ShareItemUiBinder.class); @UiField HTMLPanel container; @UiField - InlineHTML date, name; + SpanElement date, name; @UiField Anchor link; @UiField - CheckBox select; + AnchorElement shareLink; @UiField(provided = true) protected ShareMessages msg = null; private TicketDTO data; - @Override - public void onClick(final ClickEvent clickEvent) { - //TODO - } - interface ShareItemUiBinder extends UiBinder<Widget, ShareItem> { } public ShareItem() { msg = GWT.create(ShareMessages.class); initWidget(uiBinder.createAndBindUi(this)); - date.addClickHandler(this); - name.addClickHandler(this); + setContainer(container); + } + + @UiHandler("link") + protected void startTouch(TouchStartEvent event) { + startTouch(event, true); + } + + @UiHandler("link") + protected void moveTouch(TouchMoveEvent event) { + super.moveTouch(event); } - public boolean isSelected() { - return select.getValue(); + @UiHandler("link") + protected void endTouch(TouchEndEvent event) { + endTouch(event, true, new Command() { + @Override + public void execute() { + //TODO : display share informations + } + }); } public void setData(TicketDTO data) { @@ -78,14 +101,14 @@ public void setData(TicketDTO data) { Date dt = new Date(); dt.setTime(Long.parseLong(data.getCreationDate())); DateTimeFormat fmt = DateTimeFormat.getFormat("dd/MM/yyyy"); - date.setText(fmt.format(dt)); - name.setText(data.getName()); + date.setInnerText(fmt.format(dt)); + name.setInnerText(data.getName()); - link.setHref("/silverpeas/Ticket?Key=" + data.getToken()); + shareLink.setHref("/silverpeas/Ticket?Key=" + data.getToken()); if (data.getSharedObjectType().equalsIgnoreCase("Attachment")) { - link.getElement().setAttribute("download", data.getName()); + shareLink.setAttribute("download", data.getName()); } else { - link.setTarget("_blank"); + shareLink.setTarget("_blank"); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.ui.xml index 60eecc36c..715d07d10 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/ShareItem.ui.xml @@ -26,11 +26,12 @@ <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <ui:with field='msg' type='org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages'/> - <g:HTMLPanel tag="li" ui:field="container"> - <g:CheckBox ui:field="select" styleName="share-checkbox"></g:CheckBox> - <g:InlineHTML ui:field="date" styleName="share-date"></g:InlineHTML> - <g:Anchor ui:field="link" styleName="share-link" target="_self"></g:Anchor> - <g:InlineHTML ui:field="name" styleName="share-name"></g:InlineHTML> + <g:HTMLPanel tag="li" ui:field="container" styleName="share"> + <g:Anchor ui:field="link" styleName=""> + <a ui:field="shareLink" class="share-link" target="_self"></a> + <span ui:field="date" class="share-date"></span> + <span ui:field="name" class="share-name"></span> + </g:Anchor> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.java index 9a4263e68..18407a046 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.java @@ -32,4 +32,5 @@ public interface ShareMessages extends Messages { String delete(); + String deleteConfirmation(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.properties index d7f1d64d4..c314b3bfa 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages.properties @@ -24,3 +24,4 @@ title=Mes partages delete=Supprimer +deleteConfirmation=Etes-vous sur de supprimer ces partages ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_en.properties index 67d7d6c68..a3624f7aa 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_en.properties @@ -23,4 +23,5 @@ # title=My tickets -delete=Delete \ No newline at end of file +delete=Delete +deleteConfirmation=Etes-vous sur de supprimer ces partages ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_fr.properties index ce32461bd..a6b62a606 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/resources/ShareMessages_fr.properties @@ -23,4 +23,5 @@ # title=Mes partages -delete=Supprimer \ No newline at end of file +delete=Supprimer +deleteConfirmation=Delete those shares ? \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.java index 2a85b53e2..4276774df 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.java @@ -48,7 +48,6 @@ import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.survey.QuestionDTO; @@ -63,9 +62,6 @@ public class SurveyPage extends PageContent implements SurveyPagesEventHandler { @UiField(provided = true) protected SurveyMessages msg = null; @UiField(provided = true) protected ApplicationMessages msgApp = null; - @UiField - ActionsMenu actionsMenu; - @UiField UnorderedList questions; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.ui.xml index d84e1f1c1..63a47e140 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveyPage.ui.xml @@ -33,7 +33,6 @@ type='org.silverpeas.mobile.client.resources.ApplicationMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-body-a survey"> - <base:ActionsMenu ui:field="actionsMenu"/> <components:UnorderedList ui:field="questions" styleName="liste-questions forms-list"/> <g:HTMLPanel ui:field="secondPart" styleName="comment-area"> <g:InlineHTML><ui:text from="{msg.comments}"/></g:InlineHTML> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.java index aa1cc7728..79ca9e818 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.java @@ -39,7 +39,6 @@ import org.silverpeas.mobile.client.apps.survey.resources.SurveyMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.survey.SurveyDTO; @@ -55,8 +54,6 @@ public class SurveysPage extends PageContent implements SurveyPagesEventHandler @UiField UnorderedList surveys; - @UiField - ActionsMenu actionsMenu; private AddToFavoritesButton favorite = new AddToFavoritesButton(); private String instanceId; @@ -98,7 +95,7 @@ public void onSurveysLoad(final SurveysLoadedEvent event) { surveys.add(item); } - actionsMenu.addAction(favorite); + addActionMenu(favorite); favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), getPageTitle()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.ui.xml index abe4126e1..730fab862 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/survey/pages/SurveysPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.survey.resources.SurveyMessages' /> <g:HTMLPanel ui:field="container" styleName="content ui-body-a survey"> - <base:ActionsMenu ui:field="actionsMenu"/> <components:UnorderedList ui:field="surveys" styleName="liste-enquete"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksApp.java index 467b5f614..2ac564ebf 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksApp.java @@ -25,16 +25,13 @@ package org.silverpeas.mobile.client.apps.tasks; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.apps.navigation.events.app.external.AbstractNavigationEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationAppInstanceChangedEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationEventHandler; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationShowContentEvent; -import org.silverpeas.mobile.client.apps.tasks.events.app.AbstractTasksAppEvent; -import org.silverpeas.mobile.client.apps.tasks.events.app.TaskCreateEvent; -import org.silverpeas.mobile.client.apps.tasks.events.app.TaskUpdateEvent; -import org.silverpeas.mobile.client.apps.tasks.events.app.TasksAppEventHandler; -import org.silverpeas.mobile.client.apps.tasks.events.app.TasksLoadEvent; +import org.silverpeas.mobile.client.apps.tasks.events.app.*; import org.silverpeas.mobile.client.apps.tasks.events.pages.TaskCreatedEvent; import org.silverpeas.mobile.client.apps.tasks.events.pages.TaskUpdatedEvent; import org.silverpeas.mobile.client.apps.tasks.events.pages.TasksLoadedEvent; @@ -128,6 +125,24 @@ public void onSuccess(final Method method, final TaskDTO taskDTO) { action.attempt(); } + @Override + public void deleteTask(TasksDeleteEvent event) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<Void>() { + @Override + public void attempt() { + super.attempt(); + ServicesLocator.getServiceTasks().deleteTasks(event.getTasks(), this); + } + @Override + public void onSuccess(Method method, Void unused) { + super.onSuccess(method, unused); + loadTasks(new TasksLoadEvent()); + } + }; + action.attempt(); + + } + @Override public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksAppEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksAppEventHandler.java index fd2987f03..c44a82995 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksAppEventHandler.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksAppEventHandler.java @@ -30,4 +30,6 @@ public interface TasksAppEventHandler extends EventHandler{ void loadTasks(TasksLoadEvent event); void updateTask(TaskUpdateEvent event); void createTask(TaskCreateEvent event); + + void deleteTask(TasksDeleteEvent event); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksDeleteEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksDeleteEvent.java new file mode 100644 index 000000000..fd74cfdbb --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksDeleteEvent.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.apps.tasks.events.app; + +import org.silverpeas.mobile.shared.dto.TaskDTO; + +import java.util.List; + +public class TasksDeleteEvent extends AbstractTasksAppEvent { + + private List<TaskDTO> tasks; + + public TasksDeleteEvent(List<TaskDTO> tasks){ + super(); + this.tasks = tasks; + } + + @Override + protected void dispatch(TasksAppEventHandler handler) { + handler.deleteTask(this); + } + + public List<TaskDTO> getTasks() { + return tasks; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.java index e5b816c4b..ec70025d4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.java @@ -27,21 +27,27 @@ 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.Command; import com.google.gwt.user.client.ui.HTMLPanel; +import org.silverpeas.mobile.client.apps.tasks.events.app.TasksDeleteEvent; import org.silverpeas.mobile.client.apps.tasks.events.app.TasksLoadEvent; import org.silverpeas.mobile.client.apps.tasks.events.pages.AbstractTasksPagesEvent; import org.silverpeas.mobile.client.apps.tasks.events.pages.TaskCreatedEvent; import org.silverpeas.mobile.client.apps.tasks.events.pages.TaskUpdatedEvent; import org.silverpeas.mobile.client.apps.tasks.events.pages.TasksLoadedEvent; import org.silverpeas.mobile.client.apps.tasks.events.pages.TasksPagesEventHandler; -import org.silverpeas.mobile.client.apps.tasks.pages.widgets.AddTaskItem; import org.silverpeas.mobile.client.apps.tasks.pages.widgets.TaskItem; +import org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; +import org.silverpeas.mobile.client.components.PopinConfirmation; import org.silverpeas.mobile.client.components.UnorderedList; import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.components.base.widgets.AddButton; +import org.silverpeas.mobile.client.components.base.widgets.DeleteButton; import org.silverpeas.mobile.shared.dto.TaskDTO; +import java.util.ArrayList; import java.util.Iterator; /** @@ -49,32 +55,47 @@ */ public class TasksPage extends PageContent implements TasksPagesEventHandler { - interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { } private static TasksPageUiBinder uiBinder = GWT.create(TasksPageUiBinder.class); + private AddButton buttonCreate = new AddButton(); + private DeleteButton buttonDelete = new DeleteButton(); @UiField HTMLPanel container; @UiField UnorderedList list; + private TasksMessages msg = GWT.create(TasksMessages .class); + public TasksPage() { initWidget(uiBinder.createAndBindUi(this)); + setPageTitle(msg.title()); + list.getElement().setId("tasks"); EventBus.getInstance().fireEvent(new TasksLoadEvent()); EventBus.getInstance().addHandler(AbstractTasksPagesEvent.TYPE, this); + buttonDelete.setId("delete-task"); + buttonCreate.setId("add-task"); + buttonCreate.setCallback(new Command() { + @Override + public void execute() { + TaskPage page = new TaskPage(); + page.setPageTitle(msg.create()); + page.show(); + } + }); } @Override public void onTaskLoad(final TasksLoadedEvent event) { Notification.activityStop(); - - - list.add(new AddTaskItem()); - + list.clear(); + clearActions(); + addActionShortcut(buttonCreate); Iterator<TaskDTO> i = event.getTasks().iterator(); while (i.hasNext()) { TaskDTO task = i.next(); if (task != null) { TaskItem item = new TaskItem(); + item.setParent(this); item.setData(task); list.add(item); } @@ -84,6 +105,7 @@ public void onTaskLoad(final TasksLoadedEvent event) { @Override public void onTaskCreated(final TaskCreatedEvent taskCreatedEvent) { TaskItem item = new TaskItem(); + item.setParent(this); item.setData(taskCreatedEvent.getTask()); list.add(item); } @@ -95,10 +117,8 @@ public void onTaskUpdated(TaskUpdatedEvent taskUpdatedEvent) { if (list.getWidget(i) instanceof TaskItem) { TaskItem t = (TaskItem) list.getWidget(i); if (t.getData().getId() == taskUpdatedEvent.getTask().getId()) { - list.remove(t); - TaskItem item = new TaskItem(); + TaskItem item = (TaskItem) list.getWidget(i); item.setData(taskUpdatedEvent.getTask()); - list.add(item); break; } } @@ -111,4 +131,36 @@ public void stop() { super.stop(); EventBus.getInstance().removeHandler(AbstractTasksPagesEvent.TYPE, this); } + + private void deleteSelectedTasks() { + PopinConfirmation popin = new PopinConfirmation(msg.deleteConfirmation()); + popin.setYesCallback(new Command() { + @Override + public void execute() { + ArrayList<TaskDTO> selection = new ArrayList<>(); + for (int i = 0; i < list.getCount(); i++) { + TaskItem item = (TaskItem) list.getWidget(i); + if (item.isSelected()) { + selection.add(item.getData()); + } + } + EventBus.getInstance().fireEvent(new TasksDeleteEvent(selection)); + } + }); + popin.show(); + } + + @Override + public void setSelectionMode(boolean selectionMode) { + super.setSelectionMode(selectionMode); + + if (selectionMode) { + clearActions(); + buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedTasks();}}); + addActionShortcut(buttonDelete); + } else { + clearActions(); + addActionShortcut(buttonCreate); + } + } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.ui.xml index 738ed1472..0ffbcba8c 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.ui.xml @@ -24,9 +24,10 @@ <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui" + xmlns:base="urn:import:org.silverpeas.mobile.client.components.base" xmlns:components="urn:import:org.silverpeas.mobile.client.components"> - <g:HTMLPanel ui:field="container" styleName="ui-content ui-body-a"> + <g:HTMLPanel ui:field="container" styleName="ui-content ui-body-a tasks"> <components:UnorderedList ui:field="list" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"></components:UnorderedList> </g:HTMLPanel> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.java index 515026ba9..9a9652a34 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.java @@ -25,23 +25,24 @@ package org.silverpeas.mobile.client.apps.tasks.pages.widgets; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style; -import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.TouchEndEvent; +import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; import org.silverpeas.mobile.client.apps.tasks.pages.TaskPage; import org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages; +import org.silverpeas.mobile.client.components.base.widgets.SelectableItem; import org.silverpeas.mobile.shared.dto.TaskDTO; -public class TaskItem extends Composite { +public class TaskItem extends SelectableItem { private static ContactItemUiBinder uiBinder = GWT.create(ContactItemUiBinder.class); @@ -53,13 +54,13 @@ public class TaskItem extends Composite { @UiField(provided = true) protected TasksMessages msg = null; private TaskDTO task; - interface ContactItemUiBinder extends UiBinder<Widget, TaskItem> { } public TaskItem() { msg = GWT.create(TasksMessages.class); initWidget(uiBinder.createAndBindUi(this)); + setContainer(container); } public void setData(TaskDTO data) { @@ -82,27 +83,30 @@ public void setData(TaskDTO data) { range.setDisabled(true); updateRange(data.getPercentCompleted()); } - public TaskDTO getData() { return task; } - public native void addListenerInput(Element range, TaskItem item) /*-{ - range.addEventListener('input', function () { - item.@org.silverpeas.mobile.client.apps.tasks.pages.widgets.TaskItem::updateRange(I)(range.value); - }, false); - }-*/; + @UiHandler("link") + protected void startTouch(TouchStartEvent event) { + startTouch(event, task.getExternalId().isEmpty()); + } @UiHandler("link") - protected void edit(ClickEvent event) { - if (task.getExternalId().isEmpty()) { - TaskPage page = new TaskPage(); - page.setPageTitle(msg.edit()); - page.setData(task); - page.show(); - } else { - //TODO : redirect on content - } + protected void endTouch(TouchEndEvent event) { + endTouch(event, task.getExternalId().isEmpty(), new Command() { + @Override + public void execute() { + if (task.getExternalId().isEmpty()) { + TaskPage page = new TaskPage(); + page.setPageTitle(msg.edit()); + page.setData(task); + page.show(); + } else { + //TODO : redirect on content + } + } + }); } private void updateRange(final int value) { @@ -110,6 +114,4 @@ private void updateRange(final int value) { String css = "background-image: -webkit-gradient(linear, 0% 0%, 100% 0%, color-stop(" + val + ", rgb(114, 171, 14)), color-stop(" + val + ", rgb(197, 197, 197)));"; range.setAttribute("style", css); } - - } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.ui.xml index ac5cee19a..54814a39d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.ui.xml @@ -26,7 +26,7 @@ <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <ui:with field='msg' type='org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages'/> - <g:HTMLPanel tag="li" ui:field="container" styleName="task"> + <g:HTMLPanel tag="li" ui:field="container" styleName="task readonly"> <g:Anchor styleName="ui-btn ui-icon-carat-r" ui:field="link"> <span ui:field="name"></span> (<span ui:field="priority" class="task-priority"></span>) <br/><span ui:field="delegator"></span><span ui:field="endDate" class="endDate"></span> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.java index 63560ebab..977ad62f5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.java @@ -27,9 +27,12 @@ import com.google.gwt.i18n.client.Messages; public interface TasksMessages extends Messages { + String title(); String create(); String actionCreate(); String actionEdit(); String nameField(); String edit(); + + String deleteConfirmation(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.properties index 72091d1d3..74ee876e3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.properties @@ -22,9 +22,11 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +title=Mes tâches create=Créer une tâche actionCreate=Créer actionEdit=Modifier nameField=Nom de la tâche edit=Modifier +deleteConfirmation=Etes-vous sur de supprimer ces tâches ? diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_en.properties index 07eab09b9..f65635c01 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_en.properties @@ -22,9 +22,10 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +title=My tasks create=Create task actionCreate=Create actionEdit=Modify nameField=Task name edit=Edit - +deleteConfirmation=Delete those tasks ? diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_fr.properties index 72091d1d3..932455040 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages_fr.properties @@ -22,9 +22,10 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +title=Mes tâches create=Créer une tâche actionCreate=Créer actionEdit=Modifier nameField=Nom de la tâche edit=Modifier - +deleteConfirmation=Etes-vous sur de supprimer ces tâches ? diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.java index 53798427d..2f9232f70 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.java @@ -46,7 +46,6 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.components.Popin; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.workflow.WorkflowFieldDTO; @@ -65,8 +64,6 @@ public class WorkflowActionFormPage extends PageContent implements WorkflowPages @UiField UnorderedList fields; - @UiField - ActionsMenu actionsMenu; @UiField HeadingElement header; @UiField Anchor validate, cancel; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.ui.xml index 7421fb9b6..573b0d807 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowActionFormPage.ui.xml @@ -31,7 +31,6 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.apps.workflow.resources.WorkflowMessages'/> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="appHeader" ui:field="header"></h2> <components:UnorderedList ui:field="fields" styleName="workflow-form"/> <div class=" ui-controlgroup ui-controlgroup-horizontal"> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.java index 0f7952a63..375abe9d8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.java @@ -46,7 +46,6 @@ import org.silverpeas.mobile.client.apps.workflow.pages.widgets.ActionButton; import org.silverpeas.mobile.client.apps.workflow.resources.WorkflowMessages; import org.silverpeas.mobile.client.common.EventBus; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.StreamingList; import org.silverpeas.mobile.shared.dto.workflow.WorkflowDataDTO; @@ -62,8 +61,6 @@ public class WorkflowPage extends PageContent implements WorkflowPagesEventHandl @UiField FlexTable instances; @UiField - ActionsMenu actionsMenu; - @UiField ListBox roles; private String instanceId; @@ -94,8 +91,7 @@ public void loadDataInstances(final WorkflowLoadedDataEvent event) { for (Map.Entry<String, String> role : metaData.getRoles().entrySet()) { roles.addItem(role.getValue(), role.getKey()); } - roles.setVisible(true); - + roles.setVisible(roles.getItemCount()>1); EventBus.getInstance().fireEvent(new WorkflowRoleChangeEvent(roles.getSelectedValue())); } @@ -107,6 +103,7 @@ public void loadInstances(final WorkflowLoadedInstancesEvent event) { this.data.getList().addAll(event.getData().getList()); } + instances.removeAllRows(); int c = 0; for (String label : metaData.getHeaderLabels().get(roles.getSelectedValue())) { instances.setHTML(0, c, label); @@ -144,9 +141,11 @@ private void creationGesture() { ActionButton act = new ActionButton(); act.setId(ACTION_CREATE); act.init(instanceId, "create", msg.create(), null); - actionsMenu.addAction(act); + addActionMenu(act); } else { - actionsMenu.removeAction(ACTION_CREATE, false); + ActionButton act = new ActionButton(); + act.setId(ACTION_CREATE); + removeActionMenu(act); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.ui.xml index 3b3c31aa3..4b77016e5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPage.ui.xml @@ -28,7 +28,6 @@ xmlns:base="urn:import:org.silverpeas.mobile.client.components.base"> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="appHeader"></h2> <g:ListBox ui:field="roles" styleName="workflow-roles" visible="false"/> <g:FlexTable ui:field="instances" styleName="workflow-list"/> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.java index c80287774..87f810f13 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.java @@ -32,7 +32,6 @@ import org.silverpeas.mobile.client.apps.workflow.pages.widgets.ActionButton; import org.silverpeas.mobile.client.apps.workflow.pages.widgets.Field; import org.silverpeas.mobile.client.components.UnorderedList; -import org.silverpeas.mobile.client.components.base.ActionsMenu; import org.silverpeas.mobile.client.components.base.PageContent; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.workflow.FieldPresentationDTO; @@ -49,8 +48,6 @@ public class WorkflowPresentationPage extends PageContent { @UiField UnorderedList fields; - @UiField - ActionsMenu actionsMenu; @UiField HeadingElement header; public void setData(final WorkflowInstancePresentationFormDTO data) { @@ -74,7 +71,7 @@ public void setData(final WorkflowInstancePresentationFormDTO data, final Applic ActionButton act = new ActionButton(); act.setId(action.getKey()); act.init(data.getId(), action.getKey(), action.getValue(), data.getState()); - actionsMenu.addAction(act); + addActionMenu(act); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.ui.xml index b09d82651..405402a30 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/WorkflowPresentationPage.ui.xml @@ -29,7 +29,6 @@ xmlns:components="urn:import:org.silverpeas.mobile.client.components"> <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a"> - <base:ActionsMenu ui:field="actionsMenu"/> <h2 class="appHeader" ui:field="header"></h2> <components:UnorderedList ui:field="fields" styleName="workflow-form"/> </g:HTMLPanel> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/widgets/ActionButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/widgets/ActionButton.java index 013f3a1ff..ff925bc12 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/widgets/ActionButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/workflow/pages/widgets/ActionButton.java @@ -35,6 +35,7 @@ import org.silverpeas.mobile.client.apps.workflow.resources.WorkflowMessages; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; /** * @author: svu @@ -72,7 +73,7 @@ void executeAction(ClickEvent event){ ev.setState(state); EventBus.getInstance().fireEvent(ev); // hide menu - getElement().getParentElement().removeAttribute("style"); + ActionsMenu.close(getElement()); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java index ddbb8b8f1..7a83af672 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java @@ -24,6 +24,7 @@ package org.silverpeas.mobile.client.common; +import com.google.gwt.core.client.GWT; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; @@ -31,7 +32,6 @@ import com.google.gwt.http.client.Response; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.RootPanel; import com.googlecode.gwt.crypto.bouncycastle.InvalidCipherTextException; import com.googlecode.gwt.crypto.client.TripleDesCipher; import org.fusesource.restygwt.client.Method; @@ -44,7 +44,6 @@ import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.common.storage.LocalStorageHelper; -import org.silverpeas.mobile.client.pages.connexion.ConnexionPage; import org.silverpeas.mobile.shared.dto.DetailUserDTO; import org.silverpeas.mobile.shared.dto.FullUserDTO; import org.silverpeas.mobile.shared.dto.IFullUser; @@ -76,11 +75,11 @@ public static AuthentificationManager getInstance() { } public void addHeader(String key, String value) { - LocalStorageHelper.store(key, value); + LocalStorageHelper.getInstance().store(key, value); } public String getHeader(String key) { - return LocalStorageHelper.load(key); + return LocalStorageHelper.getInstance().load(key); } public void storeUser(final DetailUserDTO user, final UserProfileDTO profil, String login, @@ -97,20 +96,20 @@ public void storeUser(final DetailUserDTO user, final UserProfileDTO profil, Str String maintainSession = ResourcesManager.getParam("maintain.session"); if (maintainSession.equalsIgnoreCase("true")) { - LocalStorageHelper.store(USER_CONNECTED_KEY, u.getAutoBean()); - LocalStorageHelper.store(USER_PROFIL, profil.getAutoBean()); + LocalStorageHelper.getInstance().store(USER_CONNECTED_KEY, u.getAutoBean()); + LocalStorageHelper.getInstance().store(USER_PROFIL, profil.getAutoBean()); } } public void updateAvatarInCache(final String avatarData) { SpMobil.getUser().setAvatar(avatarData); SpMobil.getUserProfile().setAvatar(avatarData); - FullUserDTO user = FullUserDTO.getBean(LocalStorageHelper.load(USER_CONNECTED_KEY, IFullUser.class)); + FullUserDTO user = FullUserDTO.getBean(LocalStorageHelper.getInstance().load(USER_CONNECTED_KEY, IFullUser.class)); user.setAvatar(avatarData); String maintainSession = ResourcesManager.getParam("maintain.session"); if (maintainSession.equalsIgnoreCase("true")) { - LocalStorageHelper.store(USER_CONNECTED_KEY, user.getAutoBean()); - LocalStorageHelper.store(USER_PROFIL, SpMobil.getUserProfile().getAutoBean()); + LocalStorageHelper.getInstance().store(USER_CONNECTED_KEY, user.getAutoBean()); + LocalStorageHelper.getInstance().store(USER_PROFIL, SpMobil.getUserProfile().getAutoBean()); } } @@ -118,14 +117,14 @@ public void updateAvatarInCache(final String avatarData) { * Clean data in local storage. */ public void clearLocalStorage() { - LocalStorageHelper.clear(); + LocalStorageHelper.getInstance().clear(); } public FullUserDTO loadUser() { - FullUserDTO user = FullUserDTO.getBean(LocalStorageHelper.load(USER_CONNECTED_KEY, IFullUser.class)); + FullUserDTO user = FullUserDTO.getBean(LocalStorageHelper.getInstance().load(USER_CONNECTED_KEY, IFullUser.class)); SpMobil.setUser(user); UserProfileDTO profil = - UserProfileDTO.getBean(LocalStorageHelper.load(USER_PROFIL, IUserProfile.class)); + UserProfileDTO.getBean(LocalStorageHelper.getInstance().load(USER_PROFIL, IUserProfile.class)); SpMobil.setUserProfile(profil); return user; } @@ -264,9 +263,7 @@ public void onSuccess(final Method method, final Boolean showTermsOfServices) { @Override public void onFailure(final Method method, final Throwable t) { //super.onFailure(method, t); - Window.alert( - "Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage()); - + GWT.log("Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage()); if (t instanceof AuthenticationException) { EventBus.getInstance().fireEvent(new AuthenticationErrorEvent(t)); } else { @@ -278,7 +275,7 @@ public void onFailure(final Method method, final Throwable t) { } }); } else { - //TODO : terms of service ? + //TODO : terms of service in offline mode ? Notification.activityStop(); loadUser(); SpMobil.displayMainPage(); @@ -307,16 +304,12 @@ public void onResponseReceived(final Request request, final Response response) { AuthentificationManager.getInstance().clearLocalStorage(); PageHistory.getInstance().clear(); Notification.activityStop(); - ConnexionPage connexionPage = new ConnexionPage(); - RootPanel.get().clear(); - RootPanel.get().add(connexionPage); + SpMobil.getInstance().displayFirstPage(); SpMobil.destroyMainPage(); - } - @Override public void onError(final Request request, final Throwable throwable) { - + LocalStorageHelper.getInstance().storeBuildDate(); } }); } catch (RequestException e) { @@ -324,7 +317,7 @@ public void onError(final Request request, final Throwable throwable) { } } - private void clearCache() { + public void clearCache() { // clear app cache MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<Void>() { @Override @@ -344,7 +337,5 @@ public void onSuccess(final Method method, final Void unused) { } }; action.attempt(); - - } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/Html5Utils.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/Html5Utils.java index a72e17c59..6d843d4b6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/Html5Utils.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/Html5Utils.java @@ -24,13 +24,31 @@ package org.silverpeas.mobile.client.common; +import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Element; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.Anchor; +import org.silverpeas.mobile.client.common.event.speech.SpeechErrorEvent; +import org.silverpeas.mobile.client.common.event.speech.SpeechResultEvent; +import org.silverpeas.mobile.client.common.event.speech.SpeechStartEvent; +import org.silverpeas.mobile.client.common.event.speech.SpeechStopEvent; /** * @author: svu */ public class Html5Utils { + public static void disableAnchor(Anchor a) { + String style = a.getElement().getAttribute("style"); + a.getElement().setAttribute("style",style + "pointer-events: none;"); + } + + public static void enableAnchor(Anchor a) { + String style = a.getElement().getAttribute("style"); + style = style.replace("pointer-events: none;",""); + a.getElement().setAttribute("style",style); + } + public static native void setVideoFullScreen(Element element) /*-{ if (element.requestFullscreen) { element.requestFullscreen(); @@ -65,4 +83,145 @@ public static void vibrate() { public static native void vibrate(int duration) /*-{ $wnd.navigator.vibrate(duration); }-*/; + public static native boolean isSpeechSupported() /*-{ + return ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window); + }-*/; + + public static native boolean isSpeechSynthesisSupported() /*-{ + return ('speechSynthesis' in window); + }-*/; + + public static native void startListening() /*-{ + window.recognition.start(); + }-*/; + + public static native void stopListening() /*-{ + window.recognition.stop(); + }-*/; + + public static native boolean initSpeech(boolean continuous, String language) /*-{ + window.recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); + recognition.lang = language; + recognition.continuous = continuous; + + recognition.onresult = function (event) { + // Récupère le texte reconnu + var text = event.results[0][0].transcript; + @org.silverpeas.mobile.client.common.Html5Utils::onSpeechResult(Ljava/lang/String;)(text); + } + + recognition.onstart = function () { + // envoie d'un evenement sur le bus pour mise à jour GUI selon le contexte + @org.silverpeas.mobile.client.common.Html5Utils::onSpeechStart(*)(); + }; + + // Événement déclenché lorsqu'une reconnaissance vocale s'arrête + recognition.onend = function () { + // envoie d'un evenement sur le bus pour mise à jour GUI selon le contexte + @org.silverpeas.mobile.client.common.Html5Utils::onSpeechStop(*)(); + }; + + recognition.onerror = function(event) { + @org.silverpeas.mobile.client.common.Html5Utils::onSpeechError(*)(); + }; + + }-*/; + public static native JsArray<Voice> getVoices() /*-{ + return window.speechSynthesis.getVoices(); + }-*/; + + public static void readText(String[] text, Command endCallback) { + Html5Utils.cancelSpeaking(); + for (int i = 0; i < text.length; i++) { + boolean last = (i == text.length -1); + String [] sentences = text[i].split("\\."); + if (sentences.length==0) { + if (last) { + speak(text[i], endCallback); + } else { + speak(text[i], null); + } + } + for (int j = 0; j < sentences.length; j++) { + if (last && j == sentences.length -1) { + speak(sentences[j], endCallback); + } else { + speak(sentences[j], null); + } + } + } + } + + private static native void speak(String text, Command endCallback) /*-{ + var msg = new SpeechSynthesisUtterance(); + msg.text = text; + msg.addEventListener("end", function (event) { + if (endCallback != null) endCallback.@com.google.gwt.user.client.Command::execute(*)(); + }); + speechSynthesis.speak(msg); + + }-*/; + + public static native void cancelSpeaking() /*-{ + speechSynthesis.cancel(); + }-*/; + private static native void speak(String text, double volume, double rate, double pitch, String language) /*-{ + var msg = new SpeechSynthesisUtterance(); + msg.volume = volume; // From 0 to 1 + msg.rate = rate; // From 0.1 to 10 + msg.pitch = pitch; // From 0 to 2 + msg.text = text; + msg.lang = language; + speechSynthesis.speak(msg); + }-*/; + + private static native void speak(String text, double volume, double rate, double pitch, String language, String desiredVoice) /*-{ + var msg = new SpeechSynthesisUtterance(); + for (var i = 0; i < speechSynthesis.getVoices().length; i++) { + if (speechSynthesis.getVoices()[i].name === desiredVoice) { + msg.voice = speechSynthesis.getVoices()[i]; + } + } + msg.volume = volume; // From 0 to 1 + msg.rate = rate; // From 0.1 to 10 + msg.pitch = pitch; // From 0 to 2 + msg.text = text; + msg.lang = language; + speechSynthesis.speak(msg); + }-*/; + + public static void onSpeechResult(String result) { + EventBus.getInstance().fireEvent(new SpeechResultEvent(result)); + } + + public static void onSpeechStart() { + EventBus.getInstance().fireEvent(new SpeechStartEvent()); + } + + public static void onSpeechStop() { + EventBus.getInstance().fireEvent(new SpeechStopEvent()); + } + + public static void onSpeechError() { + EventBus.getInstance().fireEvent(new SpeechErrorEvent()); + } + + public static native boolean canShare(String title, String text, String url) /*-{ + var shareData = { + title: title, + text: text, + url: url + }; + return $wnd.navigator.canShare(shareData); + }-*/; + + public static native void share(String title, String text, String url) /*-{ + var shareData = { + title: title, + text: text, + url: url + }; + $wnd.navigator.share(shareData); + }-*/; + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/PublicationContentHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/PublicationContentHelper.java index b06bf7803..16a899af9 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/PublicationContentHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/PublicationContentHelper.java @@ -77,29 +77,20 @@ public void onError(final Request request, final Throwable throwable) { public static void showContent(String pubId, String appId, Element basement) { final String url = UrlUtils.getServicesLocation() + "PublicationContent" + "?id=" + pubId + "&componentId=" + appId; + String zoom = SpMobil.getContentZoomLevel(); IFrameElement iframeC = Document.get().createIFrameElement(); - try { - new RequestBuilder(RequestBuilder.GET, url).sendRequest(null, new RequestCallback() { - @Override - public void onResponseReceived(final Request request, final Response response) { - iframeC.setSrc("javascript:;"); - iframeC.getStyle().setBorderStyle(Style.BorderStyle.NONE); - iframeC.getStyle().setWidth(100, Style.Unit.PCT); - iframeC.getStyle().setOverflow(Style.Overflow.HIDDEN); - iframeC.setAttribute("onload", "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';}(this));"); - basement.appendChild(iframeC); - write(iframeC.getContentDocument(), response.getText()); - } + iframeC.setId("htmlContent"); + iframeC.setAttribute("scrolling", "no"); + iframeC.setSrc(url); - @Override - public void onError(final Request request, final Throwable throwable) { - EventBus.getInstance().fireEvent(new ErrorEvent(throwable)); - } - }); + String script = "o.contentWindow.document.body.style='zoom:" + zoom + "'; "; + script += "var h = o.contentWindow.document.body.scrollHeight;"; + script += "o.style.height=h+'px'; "; - } catch (RequestException e) { - EventBus.getInstance().fireEvent(new ErrorEvent(e)); - } + iframeC.setAttribute("onload", "javascript:(function(o){" + script + "}(this));"); + String s = "border-style: none; width: 100%; overflow: hidden;"; + iframeC.setAttribute("style", s); + basement.appendChild(iframeC); } private static native void write(Document doc, String newHTML) /*-{ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/Voice.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/Voice.java new file mode 100644 index 000000000..1801ea684 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/Voice.java @@ -0,0 +1,16 @@ +package org.silverpeas.mobile.client.common; + +import com.google.gwt.core.client.JavaScriptObject; + +public class Voice extends JavaScriptObject { + protected Voice() { + } + + public final native String getLang() /*-{ return this.lang; }-*/; + public final native String getName() /*-{ return this.name; }-*/; + public final native String getvoiceURI() /*-{ return this.voiceURI; }-*/; + + + public final native boolean getLocalService() /*-{ return this.localService; }-*/; + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/animation/RippleAnimation.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/animation/RippleAnimation.java new file mode 100644 index 000000000..521122813 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/animation/RippleAnimation.java @@ -0,0 +1,34 @@ +package org.silverpeas.mobile.client.common.animation; + +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.dom.client.Style; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Widget; + +public class RippleAnimation { + + public static void play(ClickEvent event, int duration) { + Element element = ((Widget) event.getSource()).getElement(); + SpanElement ripple = Document.get().createSpanElement(); + ripple.addClassName("ripple"); + element.appendChild(ripple); + + int x = event.getClientX() - element.getOffsetLeft(); + int y = event.getClientY() - element.getOffsetTop(); + ripple.getStyle().setLeft(x, Style.Unit.PX); + ripple.getStyle().setRight(y, Style.Unit.PX); + + Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() { + @Override + public boolean execute() { + ripple.removeFromParent(); + return false; + } + }, duration); + } + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/AbstractSpeechEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/AbstractSpeechEvent.java new file mode 100644 index 000000000..fc2d30483 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/AbstractSpeechEvent.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.common.event.speech; + +import com.google.gwt.event.shared.GwtEvent; + +public abstract class AbstractSpeechEvent extends GwtEvent<SpeechEventHandler>{ + + public static Type<SpeechEventHandler> TYPE = new Type<SpeechEventHandler>(); + + public AbstractSpeechEvent(){ + } + + @Override + public Type<SpeechEventHandler> getAssociatedType() { + return TYPE; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsCSS.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechErrorEvent.java similarity index 80% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsCSS.java rename to mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechErrorEvent.java index 87a021969..283125702 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsCSS.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechErrorEvent.java @@ -22,15 +22,17 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package org.silverpeas.mobile.client.apps.documents.resources; +package org.silverpeas.mobile.client.common.event.speech; -import com.google.gwt.resources.client.CssResource; +public class SpeechErrorEvent extends AbstractSpeechEvent { -public interface DocumentsCSS extends CssResource { - String msword(); - String msexcel(); - String mspowerpoint(); - String pdf(); - String image(); - String unknown(); + + public SpeechErrorEvent(){ + super(); + } + + @Override + protected void dispatch(SpeechEventHandler handler) { + handler.onSpeechError(this); + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechEventHandler.java new file mode 100644 index 000000000..4b685dc10 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechEventHandler.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.common.event.speech; + +import com.google.gwt.event.shared.EventHandler; + +public interface SpeechEventHandler extends EventHandler { + + void onSpeechResult(SpeechResultEvent event); + + void onSpeechStart(SpeechStartEvent event); + + void onSpeechStop(SpeechStopEvent event); + + void onSpeechError(SpeechErrorEvent event); +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechResultEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechResultEvent.java new file mode 100644 index 000000000..638d3199d --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechResultEvent.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.common.event.speech; + +public class SpeechResultEvent extends AbstractSpeechEvent { + + private String result; + + public SpeechResultEvent(String result){ + super(); + this.result = result; + } + + @Override + protected void dispatch(SpeechEventHandler handler) { + handler.onSpeechResult(this); + } + + public String getResult() { + return result; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStartEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStartEvent.java new file mode 100644 index 000000000..4ead47a59 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStartEvent.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.common.event.speech; + +public class SpeechStartEvent extends AbstractSpeechEvent { + + + public SpeechStartEvent(){ + super(); + } + + @Override + protected void dispatch(SpeechEventHandler handler) { + handler.onSpeechStart(this); + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStopEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStopEvent.java new file mode 100644 index 000000000..9c0bcb27c --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStopEvent.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.common.event.speech; + +public class SpeechStopEvent extends AbstractSpeechEvent { + + + public SpeechStopEvent(){ + super(); + } + + @Override + protected void dispatch(SpeechEventHandler handler) { + handler.onSpeechStop(this); + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java index 6de2ed037..3719cdaad 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java @@ -35,6 +35,7 @@ import org.silverpeas.mobile.client.components.IframePage; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.contact.ContactScope; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; /** * @author svu @@ -43,13 +44,41 @@ public class LinksManager { private static Boolean iosShowIframe = Boolean.parseBoolean(ResourcesManager.getParam("ios.link.open.in.iframe")); - public static void processLink(String url) { + public static void navigateToPermalink(String url) { + HyperLinkDTO dto = new HyperLinkDTO(); + dto.setUrl(url); + dto.setInternalLink(true); + dto.setOpenNewWindow(false); + processLink(dto); + } + + public static String createApplicationPermalink(String instanceId) { + return "/silverpeas/Component/" + instanceId; + } + + public static String createAlbumPermalink(String instanceId, String id) { + return "/silverpeas/Topic/"+id+"?ComponentId=" + instanceId; + } + + public static String createMediaPermalink(String id) { + return "/silverpeas/Media/"+id; + } + public static void processLink(HyperLinkDTO hyperLinkDTO) { + String url = hyperLinkDTO.getUrl(); if(sameContext(url)) { String shortcutContentType = ""; + String shortcutContentRole = null; String shortcutAppId = null; String shortcutContentId = url.substring(url.lastIndexOf("/") + 1); if (url.contains("/Publication/")) { shortcutContentType = ContentsTypes.Publication.name(); + } else if (url.contains("/File/")) { + shortcutContentType = ContentsTypes.Attachment.name(); + if (shortcutContentId.contains("?ContentLanguage")) { + String[] params = shortcutContentId.split("\\?"); + shortcutContentId = params[0]; + shortcutContentRole = params[1].replace("ContentLanguage=",""); + } } else if (url.contains("/Media/")) { shortcutContentType = ContentsTypes.Media.name(); } else if (url.contains("/Topic/")) { @@ -91,15 +120,15 @@ public static void processLink(String url) { } EventBus.getInstance().fireEvent(new ContactsFilteredLoadEvent(type, filter)); } else { - openExternalLink(url); + openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink()); return; } ShortCutRouter - .route(SpMobil.getUser(), shortcutAppId, shortcutContentType, shortcutContentId, null, null); + .route(SpMobil.getUser(), shortcutAppId, shortcutContentType, shortcutContentId, null, shortcutContentRole); return; } - openExternalLink(url); + openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink()); } private static boolean sameContext(String url) { @@ -113,18 +142,33 @@ private static boolean sameContext(String url) { return ((url.startsWith("/") || url.startsWith(context))); } - public static void openExternalLink(String url) { + public static void openExternalLink(String url, boolean openNewWindow, boolean internalLink) { if (MobilUtils.isIOS()) { if (iosShowIframe) { - IframePage page = new IframePage(url); - page.setPageTitle(""); - page.show(); + openIframePage(url); } else { - //Window.Location.assign(url); - Window.open(url, "_self", ""); + openExternalLinkStandard(url, openNewWindow, internalLink); } } else { - Window.open(url, "_blank", ""); + openExternalLinkStandard(url, openNewWindow, internalLink); + } + } + + public static void openIframePage(String url) { + IframePage page = new IframePage(url); + page.setPageTitle(""); + page.show(); + } + + private static void openExternalLinkStandard(String url, boolean openNewWindow, boolean internalLink) { + if (internalLink) { + openIframePage(url); + } else { + if (openNewWindow) { + Window.open(url, "_blank", ""); + } else { + Window.open(url, "_self", ""); + } } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/PageHistory.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/PageHistory.java index 22481a005..a08bb282a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/PageHistory.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/PageHistory.java @@ -61,11 +61,10 @@ public void goTo(PageContent page) { hideCallback(); if (pages.isEmpty()) firstToken = "" + page.hashCode(); pages.push(page); - SpMobil.getMainPage().setContent(page); + SpMobil.getMainPage().setContent(page, true); page.setVisible(true); Window.scrollTo(0,0); browserGoto(""+page.hashCode()); - //TODO : TODO : css3 transition } private void hideCallback() { @@ -86,10 +85,9 @@ public PageContent back() { PageContent page = pages.pop(); page.stop(); page = pages.peek(); - SpMobil.getMainPage().setContent(page); + SpMobil.getMainPage().setContent(page, false); page.setVisible(true); browserBack(); - //TODO : css3 transition return page; } } @@ -108,7 +106,7 @@ public void goBackToFirst() { PageContent currentPage = pages.pop(); if (pages.isEmpty()) { pages.push(currentPage); - SpMobil.getMainPage().setContent(currentPage); + SpMobil.getMainPage().setContent(currentPage, false); browserGoto(""+currentPage.hashCode()); break; } else { @@ -146,7 +144,8 @@ private void back(String token) { if (page != null) { page.stop(); page = pages.peek(); - SpMobil.getMainPage().setContent(page); + SpMobil.getMainPage().setContent(page, false); + page.setVisible(true); } else { SpMobil.restoreMainPage(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java index 02dc28f59..b38871867 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java @@ -43,12 +43,17 @@ public abstract class MethodCallbackOnlineOnly<T> implements MethodCallback<T> { private static ApplicationMessages msg = GWT.create(ApplicationMessages.class); + private boolean relogin = true; public void attempt() { Notification.activityStart(); NetworkHelper.updateConnexionIndicator(); } + public void setRelogin(boolean relogin) { + this.relogin = relogin; + } + @Override public void onFailure(final Method method, final Throwable t) { Notification.activityStop(); @@ -57,12 +62,14 @@ public void onFailure(final Method method, final Throwable t) { if (SpMobil.isSSO()) { Window.Location.assign(ResourcesManager.getSSOPath()); } else { - SpMobil.getInstance().loadIds(new Command() { - @Override - public void execute() { - attempt(); - } - }); + if (relogin) { + SpMobil.getInstance().loadIds(new Command() { + @Override + public void execute() { + attempt(); + } + }); + } } } else if (method.getResponse().getStatusCode() == 404) { new Popin(msg.notfoundError()).show(); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/NetworkHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/NetworkHelper.java index 21279b67b..984775028 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/NetworkHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/NetworkHelper.java @@ -49,6 +49,10 @@ public NetworkHelper() { watchConnectionType(this); } + public static String getContext() { + return "/silverpeas/spmobile/"; + } + private static native void watchConnectionType(NetworkHelper i) /*-{ var connection = window.navigator.connection || window.navigator.mozConnection || null; if (connection != null) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/storage/LocalStorageHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/storage/LocalStorageHelper.java index 0b8be9451..9274cbc81 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/storage/LocalStorageHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/storage/LocalStorageHelper.java @@ -28,6 +28,7 @@ import com.google.gwt.storage.client.Storage; import com.google.web.bindery.autobean.shared.AutoBean; import com.google.web.bindery.autobean.shared.AutoBeanCodex; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; /** @@ -36,9 +37,16 @@ public class LocalStorageHelper { public static AutoBeanFactory factory = GWT.create(AutoBeanFactory.class); + public static LocalStorageHelper instance; + public static LocalStorageHelper getInstance() { + if (instance == null) { + instance = new LocalStorageHelper(); + } + return instance; + } - public static <T> void store(String key, AutoBean<T> autobean) { + public <T> void store(String key, AutoBean<T> autobean) { Storage storage = Storage.getLocalStorageIfSupported(); if (storage != null) { @@ -51,7 +59,7 @@ public static <T> void store(String key, AutoBean<T> autobean) { } } - public static void store(String key, String data) { + public void store(String key, String data) { Storage storage = Storage.getLocalStorageIfSupported(); if (storage != null) { try { @@ -60,7 +68,7 @@ public static void store(String key, String data) { } } - public static String load(String key) { + public String load(String key) { Storage storage = Storage.getLocalStorageIfSupported(); if (storage != null) { String dataItem = storage.getItem(key); @@ -68,7 +76,7 @@ public static String load(String key) { } return null; } - public static <T> AutoBean<T> load(String key, Class<T> beanClass) { + public <T> AutoBean<T> load(String key, Class<T> beanClass) { Storage storage = Storage.getLocalStorageIfSupported(); if (storage != null) { String dataItem = storage.getItem(key); @@ -85,15 +93,20 @@ public static <T> AutoBean<T> load(String key, Class<T> beanClass) { return null; } - public static void clear() { + public void clear() { Storage storage = Storage.getLocalStorageIfSupported(); if (storage != null) storage.clear(); } - public static void remove(String key) { + public void remove(String key) { Storage storage = Storage.getLocalStorageIfSupported(); if (storage != null) { storage.removeItem(key); } } + + public void storeBuildDate() { + String buildDate = ResourcesManager.getParam("build.date"); + store("build.date", buildDate); + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java index 8acefe203..f27f1a095 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java @@ -55,6 +55,7 @@ private void init() { frame.getElement().getStyle().setTop(SpMobil.getMainPage().getHeaderHeight(), Style.Unit.PX); setViewport(); initWidget(frame); + setSize("100vw", "100vh"); EventBus.getInstance().addHandler(AbstractWindowEvent.TYPE, this); } @@ -115,4 +116,4 @@ public void onOrientationChange(final OrientationChangeEvent event) { } } -} +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/PopinConfirmation.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/PopinConfirmation.java index 3140a2d23..961bf627e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/PopinConfirmation.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/PopinConfirmation.java @@ -24,9 +24,11 @@ package org.silverpeas.mobile.client.components; +import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; @@ -65,9 +67,21 @@ public void onClick(final ClickEvent clickEvent) { buttons.add(no); content.add(buttons); - setWidget(content); - center(); + recenter(); + getElement().setAttribute("style", getElement().getAttribute("style") + " height: -webkit-fill-available;"); + } + + @Override + public void show() { + super.show(); + int popupHeight = getElement().getFirstChildElement().getOffsetHeight(); + int popupPaddingTop = Integer.parseInt(getElement().getStyle().getPaddingTop().replace("px","")); + getElement().getStyle().setPaddingTop(popupPaddingTop - (popupHeight/2) , Style.Unit.PX); + } + + public void recenter() { + getElement().getStyle().setPaddingTop(getElement().getAbsoluteTop() + (Window.getClientHeight() /2), Style.Unit.PX); } public void setYesCallback(Command callback) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java index 5a20f1bd1..5b6c85457 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java @@ -35,48 +35,54 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Image; -import com.google.gwt.user.client.ui.Widget; -import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsSharingEvent; +import com.google.gwt.user.client.ui.*; import org.silverpeas.mobile.client.apps.documents.pages.SharingPage; import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages; -import org.silverpeas.mobile.client.apps.documents.resources.DocumentsResources; -import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.apps.notifications.NotificationsApp; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.mobil.MobilUtils; import org.silverpeas.mobile.client.common.navigation.UrlUtils; import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.storage.CacheStorageHelper; +import org.silverpeas.mobile.client.components.IframePage; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.documents.SimpleDocumentDTO; -import org.silverpeas.mobile.shared.dto.tickets.TicketDTO; +import org.silverpeas.mobile.shared.dto.notifications.NotificationDTO; public class Attachment extends Composite { private static AttachmentUiBinder uiBinder = GWT.create(AttachmentUiBinder.class); @UiField - Anchor link, share; + Anchor link, download; @UiField SpanElement size, name, description; @UiField ImageElement icon; - protected DocumentsResources ressources = null; + @UiField + HTMLPanel operations; + + @UiField + HTML share, view, notify; private DocumentsMessages msg = null; private ApplicationMessages globalMsg = null; private SimpleDocumentDTO data = null; private int sharing; + private boolean notifiable; + + public void setNotifiable(boolean notifiable) { + this.notifiable = notifiable; + if (!notifiable) { + notify.setVisible(false); + } + } interface AttachmentUiBinder extends UiBinder<Widget, Attachment> {} public Attachment() { msg = GWT.create(DocumentsMessages.class); globalMsg = GWT.create(ApplicationMessages.class); - ressources = GWT.create(DocumentsResources.class); - ressources.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); } @@ -86,18 +92,34 @@ public void setSharing(int sharing) { share.setVisible(false); } } - public void setAttachment(SimpleDocumentDTO data) { this.data = data; render(); } + private boolean isViewable() { + boolean v = (data.getContentType().contains("msword") || data.getContentType().contains("word")); + v = v || data.getContentType().contains("excel"); + v = v || data.getContentType().contains("pdf"); + v = v || data.getContentType().contains("presentationml"); + v = v || data.getContentType().contains("opendocument.text"); + v = v || data.getContentType().contains("opendocument.spreadsheet"); + v = v || data.getContentType().contains("opendocument.presentation"); + return v; + } + private void render() { + operations.getElement().setId("operations"); + view.getElement().setId("view"); + share.getElement().setId("share"); + download.getElement().setId("download"); + notify.getElement().setId("notify"); + Image img = null; String sizeValue; - /*if (!data..isDownloadAllowed()) { - link.setStylePrimaryName("not-downloadable"); - }*/ + if (!data.isDownloadable()) { + download.setVisible(false); + } if (data.getSize() < 1024 * 1024) { sizeValue = String.valueOf(data.getSize() / 1024); size.setInnerHTML(msg.sizeK(sizeValue)); @@ -116,69 +138,123 @@ private void render() { description.getStyle().setDisplay(Style.Display.NONE); } - if (data.getContentType().contains("msword")) { - img = new Image(ressources.msword()); - } else if (data.getContentType().contains("sheet")) { - img = new Image(ressources.msexcel()); + if (data.getContentType().contains("msword") || data.getContentType().contains("word")) { + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-word.svg"); + } else if (data.getContentType().contains("excel")) { + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-excel.svg"); } else if (data.getContentType().contains("pdf")) { - img = new Image(ressources.pdf()); + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-pdf.svg"); } else if (data.getContentType().contains("image")) { - img = new Image(ressources.image()); - } else if (data.getContentType().contains("presentation")) { - img = new Image(ressources.mspowerpoint()); + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-image.svg"); + } else if (data.getContentType().contains("presentationml")) { + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-powerpoint.svg"); + } else if (data.getContentType().contains("zip")) { + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-zip.svg"); + } else if (data.getContentType().contains("opendocument.text")) { + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-writer.svg"); + } else if (data.getContentType().contains("opendocument.spreadsheet")) { + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-calc.svg"); + } else if (data.getContentType().contains("opendocument.presentation")) { + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-presentation.svg"); } else { - img = new Image(ressources.unknown()); + icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-unknown.svg"); } - icon.getParentElement().replaceChild(img.getElement(), icon); - // link generation try { String url = UrlUtils.getAttachedFileLocation(); - url += "componentId/"; - url += data.getInstanceId(); - url += "/attachmentId/"; - url += data.getId(); - url += "/lang/"; - url += data.getLang(); - url += "/name/"; - url += data.getFileName(); - - link.setHref(url); - if (MobilUtils.isIOS()) { - //link.setTarget("_blank"); - link.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent clickEvent) { - String u = ((Anchor) clickEvent.getSource()).getHref(); - if (NetworkHelper.isOnline()) { - CacheStorageHelper.store(u); - } - Window.open(u, "_blank", "fullscreen=yes"); - } - }); + if (data.isDownloadable()) { + url += "componentId/"; + url += data.getInstanceId(); + url += "/attachmentId/"; + url += data.getId(); + url += "/lang/"; + url += data.getLang(); + url += "/name/"; + url += data.getFileName(); } else { - link.setTarget("_self"); - link.getElement().setAttribute("download", data.getFileName()); - link.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent clickEvent) { - if (NetworkHelper.isOnline()) { - CacheStorageHelper.store(((Anchor) clickEvent.getSource()).getHref()); - } - } - }); + url = "#"; } + download.setHref(url); + link.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent clickEvent) { + toogleOperations(); + } + }); + + if (!isViewable()) view.setVisible(false); + } catch (JavaScriptException e) { Notification.alert(e.getMessage()); } } + + private void toogleOperations() { + if (operations.getStylePrimaryName().equalsIgnoreCase("ops-closed")) { + operations.setStylePrimaryName("ops-open"); + link.setStylePrimaryName("expand-less"); + } else { + operations.setStylePrimaryName("ops-closed"); + link.setStylePrimaryName("expand-more"); + } + } + + private boolean isVisibleOperations() { + return operations.getStylePrimaryName().equals("ops-open"); + } + + private void viewDocument() { + AttachmentsManager.viewDocument(data.getId(), data.getLang()); + } + @UiHandler("share") protected void share(ClickEvent event) { - SharingPage page = new SharingPage(); - page.setData("Attachment", data.getSpId(), data.getInstanceId()); - page.show(); + if (isVisibleOperations()) { + SharingPage page = new SharingPage(); + page.setData("Attachment", data.getSpId(), data.getInstanceId()); + page.show(); + } + } + @UiHandler("download") + protected void download(ClickEvent event) { + if (isVisibleOperations()) { + if (MobilUtils.isIOS()) { + if (data.isDownloadable()) { + String u = link.getHref(); + if (NetworkHelper.isOnline()) { + CacheStorageHelper.store(u); + } + Window.open(u, "_blank", "fullscreen=yes"); + } else { + viewDocument(); + } + } else { + if (data.isDownloadable()) { + link.setTarget("_self"); + link.getElement().setAttribute("download", data.getFileName()); + if (NetworkHelper.isOnline()) { + CacheStorageHelper.store(((Anchor) event.getSource()).getHref()); + } + } else { + viewDocument(); + } + } + } + } + + @UiHandler("view") + protected void view(ClickEvent event) { + if (isVisibleOperations()) viewDocument(); + } + + @UiHandler("notify") + protected void notify(ClickEvent event) { + if (isVisibleOperations()) { + NotificationsApp app = new NotificationsApp(data.getInstanceId(), data.getId(), NotificationDTO.TYPE_DOCUMENT, data.getFileName(), data.getFileName()); + app.start(); + } } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.ui.xml index e1c48499a..6a100a3e7 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.ui.xml @@ -26,13 +26,21 @@ <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> <g:HTMLPanel tag="li"> - <g:Anchor ui:field="link" styleName="downloadable"> - <img ui:field="icon" src=""/> - <span ui:field="name"></span><span ui:field="size" class="weight"></span> - <span ui:field="description"></span> + <g:Anchor ui:field="link" styleName="expand-more" href="javascript:;"> + <div> + <img ui:field="icon" src=""/> + </div> + <div> + <span ui:field="name"></span><span ui:field="size" class="weight"></span> + <span ui:field="description"></span> + </div> </g:Anchor> - <g:Anchor ui:field="share" styleName="share"> + <g:HTMLPanel ui:field="operations" stylePrimaryName="ops-closed"> + <g:HTML ui:field="notify"></g:HTML> + <g:HTML ui:field="share"></g:HTML> + <g:Anchor ui:field="download"></g:Anchor> + <g:HTML ui:field="view"></g:HTML> + </g:HTMLPanel> - </g:Anchor> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/AttachmentsManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/AttachmentsManager.java index ab5a9d7eb..6cf2c5646 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/AttachmentsManager.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/AttachmentsManager.java @@ -32,12 +32,19 @@ import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.mobil.MobilUtils; import org.silverpeas.mobile.client.common.navigation.UrlUtils; +import org.silverpeas.mobile.client.components.IframePage; /** * @author svu */ public class AttachmentsManager { + public static void viewDocument(String id, String lang) { + IframePage page = new IframePage("/silverpeas/services/media/viewer/embed/pdf?documentId=" + id + "" + + "&documentType=attachment&language=" + lang + "&embedPlayer=true"); + page.show(); + } + public static void generateLink(String id, String instanceId, String lang, String title, Anchor link) { try { String url = UrlUtils.getAttachedFileLocation(); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionItem.java index f5c78f02a..41e30193f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionItem.java @@ -24,6 +24,7 @@ package org.silverpeas.mobile.client.components.base; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Composite; /** @@ -32,6 +33,7 @@ public class ActionItem extends Composite { private String id; + private Command callback; public String getId() { @@ -41,4 +43,12 @@ public String getId() { public void setId(final String id) { this.id = id; } + + public void setCallback(Command callback) { + this.callback = callback; + } + + protected Command getCallback() { + return this.callback; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.java new file mode 100644 index 000000000..4e775e429 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.components.base; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.components.UnorderedList; + +/** + * @author: svu + */ +public class ActionsList extends Composite { + + interface ActionsMenuUiBinder extends UiBinder<Widget, ActionsList> { + } + + private static ActionsMenuUiBinder uiBinder = GWT.create(ActionsMenuUiBinder.class); + + @UiField HTMLPanel container; + @UiField + UnorderedList listActions; + + public ActionsList() { + initWidget(uiBinder.createAndBindUi(this)); + listActions.setId("actionList-bloc"); + container.getElement().setId("actionsList"); + container.getElement().addClassName("empty"); + } + public boolean isEmpty() { + return (listActions.getWidgetCount() == 0); + } + + public void addAction(ActionItem action) { + for (int i = 0; i < listActions.getWidgetCount(); i++) { + ActionItem act = (ActionItem) listActions.getWidget(i); + if (act.getId().equals(action.getId())) return; + } + listActions.add(action); + container.getElement().removeClassName("empty"); + } + + public void clear() { + listActions.clear(); + container.getElement().addClassName("empty"); + } + + public void removeAction(String id, boolean silently) { + for (int i = 0; i < listActions.getWidgetCount(); i++) { + ActionItem act = (ActionItem) listActions.getWidget(i); + if (act.getId().equals(id)) { + listActions.remove(act); + break; + } + } + if (isEmpty()) { + container.getElement().addClassName("empty"); + } + } +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.ui.xml new file mode 100644 index 000000000..68e24eaab --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.ui.xml @@ -0,0 +1,32 @@ +<!-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "https://www.silverpeas.org/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' + xmlns:g='urn:import:com.google.gwt.user.client.ui' + xmlns:components="urn:import:org.silverpeas.mobile.client.components"> + <g:HTMLPanel ui:field="container"> + <components:UnorderedList ui:field="listActions" /> + </g:HTMLPanel> + +</ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsMenu.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsMenu.java index e3c755e2c..cdbcfacd4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsMenu.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsMenu.java @@ -25,7 +25,7 @@ package org.silverpeas.mobile.client.components.base; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Style; +import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; @@ -34,6 +34,7 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.components.UnorderedList; /** @@ -46,6 +47,7 @@ interface ActionsMenuUiBinder extends UiBinder<Widget, ActionsMenu> { private static ActionsMenuUiBinder uiBinder = GWT.create(ActionsMenuUiBinder.class); + private ActionsList actionsShortcuts; @UiField HTMLPanel container; @UiField UnorderedList listActions; @@ -56,15 +58,39 @@ public ActionsMenu() { listActions.setId("action-bloc"); actions.getElement().setId("action-button"); container.getElement().setId("actions"); - container.getElement().getStyle().setDisplay(Style.Display.NONE); + listActions.getElement().addClassName("closed-qvf-menu"); + } + + public void setActionsShortcuts(ActionsList actionsShortcuts) { + this.actionsShortcuts = actionsShortcuts; + hide(); } @UiHandler("actions") protected void showActions(ClickEvent event) { - if (listActions.getStyleDisplay().equalsIgnoreCase("none") || listActions.getStyleDisplay().isEmpty()) { - listActions.setStyledisplay(Style.Display.BLOCK); + if (listActions.getElement().getClassName().equals("closed-qvf-menu")) { + listActions.getElement().addClassName("open-qvf-menu"); + listActions.getElement().removeClassName("closed-qvf-menu"); + enableAllItem(true); } else { - listActions.setStyledisplay(Style.Display.NONE); + close(); + } + } + + public static void close(Element action) { + SpMobil.getMainPage().getHeader().actionsMenu.close(); + } + + public void close() { + listActions.getElement().removeClassName("open-qvf-menu"); + listActions.getElement().addClassName("closed-qvf-menu"); + enableAllItem(false); + } + + private void enableAllItem(boolean enable) { + for (int i = 0; i < listActions.getCount(); i++) { + ActionItem item = (ActionItem) listActions.getWidget(i); + item.setVisible(enable); } } @@ -78,7 +104,13 @@ public void addAction(ActionItem action) { if (act.getId().equals(action.getId())) return; } listActions.add(action); - container.getElement().getStyle().setDisplay(Style.Display.BLOCK); + action.setVisible(false); + show(); + } + + public void clear() { + listActions.clear(); + hide(); } public void removeAction(String id, boolean silently) { @@ -91,7 +123,17 @@ public void removeAction(String id, boolean silently) { } } if (isEmpty()) { - container.getElement().getStyle().setDisplay(Style.Display.NONE); + hide(); } } + + private void show() { + container.getElement().removeClassName("empty"); + this.actionsShortcuts.getElement().removeClassName("menu-empty"); + } + + private void hide() { + container.getElement().addClassName("empty"); + this.actionsShortcuts.getElement().addClassName("menu-empty"); + } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java index c65fdaf27..d4f82c379 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java @@ -25,7 +25,10 @@ package org.silverpeas.mobile.client.components.base; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.KeyCodes; @@ -45,6 +48,7 @@ import org.silverpeas.mobile.client.apps.navigation.events.app.external .NavigationAppInstanceChangedEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationShowContentEvent; +import org.silverpeas.mobile.client.apps.navigation.pages.widgets.NavigationItem; import org.silverpeas.mobile.client.apps.profile.ProfileApp; import org.silverpeas.mobile.client.apps.profile.events.ProfileEvents; import org.silverpeas.mobile.client.common.AuthentificationManager; @@ -52,6 +56,7 @@ import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.navigation.PageHistory; import org.silverpeas.mobile.client.common.resources.ResourcesManager; +import org.silverpeas.mobile.client.components.UnorderedList; import org.silverpeas.mobile.client.components.base.events.page.AbstractPageEvent; import org.silverpeas.mobile.client.components.base.events.page.DataLoadedEvent; import org.silverpeas.mobile.client.components.base.events.page.LoadingDataFinishEvent; @@ -67,21 +72,35 @@ import org.silverpeas.mobile.shared.dto.StatusDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.Apps; +import org.silverpeas.mobile.shared.helpers.ApplicationsHelper; + +import java.util.List; public class NavigationMenu extends Composite implements PageEventHandler { private static NavigationMenuUiBinder uiBinder = GWT.create(NavigationMenuUiBinder.class); @UiField HTMLPanel container, user; - @UiField Anchor home, disconnect, updateStatus, searchButton, help, config, calendar, notifications, shares; - @UiField SpanElement status; + @UiField Anchor home, disconnect, updateStatus, help, config, calendar, notifications, shares; + @UiField SpanElement status, iconHelp, iconSettings, iconHome, iconLogout, iconUserCalendar, iconInbox, iconShareBox; @UiField TextBox search; @UiField AvatarUpload avatar; + @UiField + AnchorElement searchButton; + @UiField(provided = true) protected ApplicationMessages msg = null; + @UiField UnorderedList listApplications; + + private boolean personalAppsInitialized = false; + private ApplicationResources resources = GWT.create(ApplicationResources.class); + public boolean isPersonalAppsInitialized() { + return personalAppsInitialized; + } + interface NavigationMenuUiBinder extends UiBinder<Widget, NavigationMenu> { } @@ -89,7 +108,7 @@ public NavigationMenu() { msg = GWT.create(ApplicationMessages.class); initWidget(uiBinder.createAndBindUi(this)); container.getElement().setId("silverpeas-navmenu-panel"); - container.getElement().getStyle().setHeight(Window.getClientHeight(), Unit.PX); + listApplications.getElement().setId("personals-apps"); user.getElement().setId("user"); String url = ResourcesManager.getParam("help.url"); if (url != null && !url.isEmpty()) { @@ -101,9 +120,33 @@ public NavigationMenu() { help.setTarget("_blank"); } } + iconSettings.setInnerHTML(resources.settings().getText()); + iconHelp.setInnerHTML(resources.help().getText()); + iconLogout.setInnerHTML(resources.logout().getText()); + iconHome.setInnerHTML(resources.home().getText()); + iconUserCalendar.setInnerHTML(resources.usercalendar().getText()); + iconInbox.setInnerHTML(resources.inbox().getText()); + iconShareBox.setInnerHTML(resources.sharebox().getText()); + searchButton.setInnerHTML(resources.search().getText()); EventBus.getInstance().addHandler(AbstractPageEvent.TYPE, this); } + public void setPersonalApps(List<ApplicationInstanceDTO> applicationInstanceDTOS) { + listApplications.clear(); + for (ApplicationInstanceDTO app : applicationInstanceDTOS) { + if (ApplicationsHelper.isSupportedApp(app)) { + if (app.getType().equals(Apps.kmelia.name())) { + app.setLabel(msg.myDocuments()); + } + NavigationItem item = new NavigationItem(); + item.getElement().getFirstChildElement().removeClassName("icon-app"); + item.setData(app); + listApplications.add(item); + } + } + personalAppsInitialized = true; + } + @Override public void receiveEvent(PageEvent event) { if (event.getSender() instanceof ProfileApp && event.getName().equals(ProfileEvents.POSTED.toString())) { @@ -128,8 +171,10 @@ public void loadedMoreDataEvent(final MoreDataLoadedEvent moreDataLoadedEvent) { public void toogleMenu() { if (container.getStyleName().contains("ui-panel-close")) { + container.getElement().getStyle().setVisibility(Style.Visibility.VISIBLE); container.removeStyleName("ui-panel-close"); container.addStyleName("ui-panel-open"); + } else { closeMenu(); } @@ -138,6 +183,14 @@ public void toogleMenu() { public void closeMenu() { container.removeStyleName("ui-panel-open"); container.addStyleName("ui-panel-close"); + Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() { + @Override + public boolean execute() { + container.getElement().getStyle().setVisibility(Style.Visibility.HIDDEN); + return false; + } + }, 400); + } public void resetSearchField() { @@ -152,19 +205,20 @@ protected void search(KeyDownEvent event) { } } - @UiHandler("searchButton") + /*@UiHandler("searchButton") protected void searchIos(ClickEvent event) { SpMobil.search(search.getText()); - } + }*/ @UiHandler("home") protected void goHome(ClickEvent event) { goHome(); - closeMenu(); + SpMobil.getMainPage().closeMenu(); } static void goHome() { String url = Window.Location.getHref(); + SpMobil.getMainPage().getHeader().clearActions(); if (url.contains("shortcutContentType")) { String homeUrl = url.substring(0,url.indexOf("?")); Window.Location.replace(homeUrl); @@ -178,7 +232,7 @@ protected void goSharesBox(ClickEvent event) { ContentDTO content = new ContentDTO(); content.setType(ContentsTypes.SharesBox.toString()); EventBus.getInstance().fireEvent(new NavigationShowContentEvent(content)); - closeMenu(); + SpMobil.getMainPage().closeMenu(); } @UiHandler("notifications") @@ -186,41 +240,42 @@ protected void goNotificationsBox(ClickEvent event) { ContentDTO content = new ContentDTO(); content.setType(ContentsTypes.NotificationsBox.toString()); EventBus.getInstance().fireEvent(new NavigationShowContentEvent(content)); - closeMenu(); + SpMobil.getMainPage().closeMenu(); } @UiHandler("help") protected void goHelp(ClickEvent event) { - closeMenu(); + SpMobil.getMainPage().closeMenu(); } @UiHandler("config") protected void goConfig(ClickEvent event) { App app = new ConfigApp(); app.start(); - closeMenu(); + SpMobil.getMainPage().closeMenu(); } @UiHandler("updateStatus") protected void updateStatus(ClickEvent event) { App app = new ProfileApp(); app.start(); - closeMenu(); + SpMobil.getMainPage().closeMenu(); } @UiHandler("disconnect") protected void disconnect(ClickEvent event) { - closeMenu(); + SpMobil.getMainPage().closeMenu(); AuthentificationManager.getInstance().logout(); } @UiHandler("calendar") protected void calendar(ClickEvent event) { ApplicationInstanceDTO app = new ApplicationInstanceDTO(); + app.setPersonnal(true); app.setId("userCalendar" + SpMobil.getUser().getId() + "_PCI"); app.setType(Apps.userCalendar.name()); EventBus.getInstance().fireEvent(new NavigationAppInstanceChangedEvent(app)); - closeMenu(); + SpMobil.getMainPage().closeMenu(); } public void setUser(DetailUserDTO currentUser) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.ui.xml index 051e8b3a5..062d07205 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.ui.xml @@ -23,7 +23,9 @@ --> <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> -<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:w="urn:import:org.silverpeas.mobile.client.components.base.widgets"> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui" + xmlns:components="urn:import:org.silverpeas.mobile.client.components" + xmlns:w="urn:import:org.silverpeas.mobile.client.components.base.widgets"> <ui:with field='msg' type='org.silverpeas.mobile.client.resources.ApplicationMessages'/> @@ -37,17 +39,43 @@ <div id="menu-search"> <g:TextBox ui:field="search" styleName="searchBox"/> - <g:Anchor ui:field="searchButton" styleName="searchButton" text="{msg.search}"/> + <a ui:field="searchButton" class="searchButton"></a> </div> <ul id="navmenu-panel"> - <li id="menu-home"><g:Anchor ui:field="home" styleName="ui-link" text="{msg.home}"/></li> - <li id="menu-usercalendar"><g:Anchor ui:field="calendar" styleName="ui-link" text="{msg.usercalendar}"/></li> - <li id="menu-notificationsbox"><g:Anchor ui:field="notifications" styleName="ui-link" text="{msg.notifications}"/></li> - <li id="menu-sharesbox"><g:Anchor ui:field="shares" styleName="ui-link" text="{msg.shares}"/></li> - <li id="menu-parameter"><g:Anchor ui:field="config" styleName="ui-link" text="{msg.config}"/></li> - <li id="menu-help"><g:Anchor ui:field="help" styleName="ui-link" text="{msg.help}"/></li> - <li id="menu-logout"><g:Anchor ui:field="disconnect" styleName="ui-link" text="{msg.disconnect}"/></li> + <li id="menu-usercalendar"> + <span ui:field="iconUserCalendar"></span> + <g:Anchor ui:field="calendar" styleName="ui-link" text="{msg.usercalendar}"/> + </li> + <li id="menu-notificationsbox"> + <span ui:field="iconInbox"></span> + <g:Anchor ui:field="notifications" styleName="ui-link" text="{msg.notifications}"/> + </li> + <li id="menu-sharesbox"> + <span ui:field="iconShareBox"></span> + <g:Anchor ui:field="shares" styleName="ui-link" text="{msg.shares}"/> + </li> + </ul> + + <components:UnorderedList ui:field="listApplications" /> + + <ul id="actions-menu"> + <li id="menu-home"> + <span ui:field="iconHome"></span> + <g:Anchor ui:field="home" styleName="ui-link" text="{msg.home}"/> + </li> + <li id="menu-parameter"> + <span ui:field="iconSettings"></span> + <g:Anchor ui:field="config" styleName="ui-link" text="{msg.config}"/> + </li> + <li id="menu-help"> + <span ui:field="iconHelp"></span> + <g:Anchor ui:field="help" styleName="ui-link" text="{msg.help}"/> + </li> + <li id="menu-logout"> + <span ui:field="iconLogout"></span> + <g:Anchor ui:field="disconnect" styleName="ui-link" text="{msg.disconnect}"/> + </li> </ul> </div> </g:HTMLPanel> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.java index c6f6312ca..166421d35 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.client.components.base; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.uibinder.client.UiBinder; @@ -41,6 +42,9 @@ import org.silverpeas.mobile.client.components.homepage.HomePageNewsSlider; import org.silverpeas.mobile.client.pages.main.HomePage; import org.silverpeas.mobile.shared.dto.DetailUserDTO; +import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; + +import java.util.List; public class Page extends Composite implements Window.ScrollHandler { @@ -49,7 +53,7 @@ public class Page extends Composite implements Window.ScrollHandler { interface PageUiBinder extends UiBinder<Widget, Page> { } - @UiField protected SimplePanel contentPlace; + @UiField protected SimplePanel contentPlace, contentPlaceTmp; @UiField protected PageHeader header; @UiField protected NavigationMenu menu; @UiField protected DivElement contentContainer; @@ -64,8 +68,34 @@ public Page() { container.getElement().setId("home"); } - public void setContent(PageContent content) { + public DivElement getContentContainer() { + return contentContainer; + } + + public void setContent(PageContent content, boolean newContent) { + if (this.content != null && this.content.hashCode() == content.hashCode()) return; + String transitionClass; + if (newContent) { + transitionClass = "opening-page"; + } else { + transitionClass = "closing-page"; + } + + getContentContainer().addClassName(transitionClass); + contentPlaceTmp.setWidget(content); + Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() { + @Override + public boolean execute() { + displayContent(content); + getContentContainer().removeClassName(transitionClass); + return false; + } + }, 300); + } + + private void displayContent(PageContent content) { this.content = content; + //contentPlaceTmp.remove(content); contentPlace.setWidget(content); header.setPageTitle(content.getPageTitle()); header.setVisibleBackButton(PageHistory.getInstance().size() > 1); @@ -83,6 +113,7 @@ public void toogleMenu() { public void closeMenu() { menu.closeMenu(); + header.closeMenuButton(); } public void setUser(DetailUserDTO user) { @@ -113,6 +144,9 @@ public int getHeaderHeight() { } public int getFooterHeight() { return footer.getOffsetHeight() ; } + public PageHeader getHeader() { + return header; + } public void showOfflineIndicator() { header.showOfflineIndicator(); } @@ -121,4 +155,12 @@ public void hideOfflineIndicator() { header.hideOfflineIndicator(); } + public void setPersonalApps(List<ApplicationInstanceDTO> applicationInstanceDTOS) { + menu.setPersonalApps(applicationInstanceDTOS); + } + + public boolean isPersonalAppsInitialized() { + return menu.isPersonalAppsInitialized(); + } + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.ui.xml index 081ab2c00..4e59d9894 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.ui.xml @@ -41,6 +41,7 @@ <!-- Content --> <g:SimplePanel ui:field="contentPlace"/> + <g:SimplePanel ui:field="contentPlaceTmp" visible="false"/> </div> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageContent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageContent.java index b43e4c1e5..39a336178 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageContent.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageContent.java @@ -49,13 +49,22 @@ import org.silverpeas.mobile.client.components.base.events.page.PageEvent; import org.silverpeas.mobile.client.components.base.events.page.PageEventHandler; +import java.util.ArrayList; +import java.util.List; + public abstract class PageContent extends Composite implements View, NativePreviewHandler, PageEventHandler { private App app; protected boolean clicked = false; + + private boolean selectionMode = false; protected String pageTitle; private HandlerRegistration registration; private SwipeRecognizer swipeRecognizer; + private List<ActionItem> actionsMenu = new ArrayList<>(); + private List<ActionItem> actionsShortcuts = new ArrayList<>(); + + private int changeSelectionNumber = 0; public PageContent() { super(); @@ -87,6 +96,31 @@ public void show() { PageHistory.getInstance().goTo(this); } + public void addActionShortcut(ActionItem action) { + actionsShortcuts.add(action); + SpMobil.getMainPage().getHeader().addActionShortcut(action); + } + + public void removeActionShortcut(ActionItem action) { + actionsShortcuts.remove(action); + SpMobil.getMainPage().getHeader().removeActionShortcut(action); + } + + public void clearActions() { + actionsShortcuts.clear(); + SpMobil.getMainPage().getHeader().clearActions(); + } + + public void addActionMenu(ActionItem action) { + actionsMenu.add(action); + SpMobil.getMainPage().getHeader().addActionMenu(action); + } + + public void removeActionMenu(ActionItem action) { + actionsMenu.remove(action); + SpMobil.getMainPage().getHeader().removeActionMenu(action); + } + public boolean isVisible() { return PageHistory.getInstance().isVisible(this); } @@ -114,6 +148,18 @@ public boolean execute() { } } + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + SpMobil.getMainPage().getHeader().closeMenuQVF(); + SpMobil.getMainPage().getHeader().clearActions(); + for (ActionItem action : actionsShortcuts) { + SpMobil.getMainPage().getHeader().addActionShortcut(action); + } + for (ActionItem action : actionsMenu) { + SpMobil.getMainPage().getHeader().addActionMenu(action); + } + } @Override public void stop() { EventBus.getInstance().removeHandler(AbstractPageEvent.TYPE, this); @@ -157,9 +203,27 @@ public void finishLoadingData(final LoadingDataFinishEvent loadingDataFinishEven public void loadedDataEvent(final DataLoadedEvent dataLoadedEvent) { // to be override if necessary } - @Override public void loadedMoreDataEvent(final MoreDataLoadedEvent moreDataLoadedEvent) { // to be override if necessary } + + public boolean isSelectionMode() { + return selectionMode; + } + public void setSelectionMode(boolean selectionMode) { + this.selectionMode = selectionMode; + resetSelectionNumber(); + } + + public void changeSelectionNumber(int i) { + changeSelectionNumber = changeSelectionNumber + i; + if (changeSelectionNumber == 0) { + setSelectionMode(false); + } + } + + private void resetSelectionNumber() { + changeSelectionNumber = 0; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.java index 29d839ec2..a630ce626 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.java @@ -36,7 +36,10 @@ import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationShowContentEvent; import org.silverpeas.mobile.client.apps.profile.ProfileApp; import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.Html5Utils; +import org.silverpeas.mobile.client.common.animation.RippleAnimation; import org.silverpeas.mobile.client.common.app.App; +import org.silverpeas.mobile.client.common.navigation.PageHistory; import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.client.resources.ApplicationResources; @@ -64,6 +67,13 @@ public PageFooter() { ressources.css().ensureInjected(); tchat.setVisible(Boolean.parseBoolean(ResourcesManager.getParam("chat.enable"))); + + browse.setHTML(ressources.homeShortcut().getText()); + favoris.setHTML(ressources.favoritesShortcut().getText()); + tasks.setHTML(ressources.tasksShortcut().getText()); + tchat.setHTML(ressources.chatShortcut().getText()); + contact.setHTML(ressources.contactsShortcut().getText()); + addCustomButtons(); } @@ -83,27 +93,34 @@ private void addCustomButtons() { @UiHandler("browse") protected void browse(ClickEvent event) { NavigationMenu.goHome(); + RippleAnimation.play(event, 150); } @UiHandler("favoris") protected void goFavoris(ClickEvent event) { + PageHistory.getInstance().goBackToFirst(); ContentDTO content = new ContentDTO(); content.setType(ContentsTypes.Favortis.toString()); EventBus.getInstance().fireEvent(new NavigationShowContentEvent(content)); + RippleAnimation.play(event, 150); } @UiHandler("tasks") protected void goTasks(ClickEvent event) { + PageHistory.getInstance().goBackToFirst(); ContentDTO content = new ContentDTO(); content.setType(ContentsTypes.Tasks.toString()); EventBus.getInstance().fireEvent(new NavigationShowContentEvent(content)); + RippleAnimation.play(event, 150); } @UiHandler("contact") - void contacts(ClickEvent e) { + void contacts(ClickEvent event) { + PageHistory.getInstance().goBackToFirst(); ContentDTO content = new ContentDTO(); content.setType(ContentsTypes.Contacts.toString()); EventBus.getInstance().fireEvent(new NavigationShowContentEvent(content)); + RippleAnimation.play(event, 150); } public int getHeight() { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.ui.xml index 46adab722..3908be5a8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.ui.xml @@ -28,10 +28,10 @@ <ui:with field='msg' type='org.silverpeas.mobile.client.resources.ApplicationMessages'/> <g:HTMLPanel ui:field="footer"> - <g:Anchor stylePrimaryName="btn-list-navigation" ui:field="browse"><ui:safehtml from="{msg.browser}"/></g:Anchor> - <g:Anchor stylePrimaryName="btn-list-favoris" ui:field="favoris"><ui:safehtml from="{msg.appFavortis}"/></g:Anchor> - <g:Anchor stylePrimaryName="btn-find-contact" ui:field="contact"><ui:safehtml from="{msg.appContact}"/></g:Anchor> - <g:Anchor stylePrimaryName="btn-list-task" ui:field="tasks">{msg.tasks}/></g:Anchor> - <g:Anchor stylePrimaryName="btn-update-tchat" ui:field="tchat" href="chat.jsp" target="_blank"><ui:safehtml from="{msg.tchat}"/></g:Anchor> + <g:Anchor stylePrimaryName="btn-list-navigation" ui:field="browse"></g:Anchor> + <g:Anchor stylePrimaryName="btn-list-favoris" ui:field="favoris"></g:Anchor> + <g:Anchor stylePrimaryName="btn-find-contact" ui:field="contact"></g:Anchor> + <g:Anchor stylePrimaryName="btn-list-task" ui:field="tasks"></g:Anchor> + <g:Anchor stylePrimaryName="btn-update-tchat" ui:field="tchat" href="chat.jsp" target="_blank"></g:Anchor> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.java index 8a1f7cb77..6dadcb6d1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.java @@ -30,10 +30,7 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.*; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.common.navigation.PageHistory; import org.silverpeas.mobile.client.common.resources.ResourcesManager; @@ -44,12 +41,19 @@ public class PageHeader extends Composite { private static PageHeaderUiBinder uiBinder = GWT.create(PageHeaderUiBinder.class); + public void closeMenuQVF() { + actionsMenu.close(); + } + interface PageHeaderUiBinder extends UiBinder<Widget, PageHeader> { } @UiField protected HTMLPanel header; - @UiField protected Anchor menu, back; + @UiField protected Anchor back; @UiField protected HeadingElement title; + @UiField protected HTML menu; + @UiField protected ActionsList actionsShortcuts; + @UiField protected ActionsMenu actionsMenu; @UiField(provided = true) protected ApplicationMessages msg = null; protected ApplicationResources ressources = null; @@ -60,30 +64,74 @@ public PageHeader() { header.getElement().setId("header"); menu.getElement().setId("menu"); ressources.css().ensureInjected(); - title.setInnerText(ResourcesManager.getLabel("mainpage.title")); + actionsMenu.setActionsShortcuts(actionsShortcuts); + } + + public void addActionShortcut(ActionItem action) { + actionsShortcuts.addAction(action); + adjustTitle(); + } + + private void adjustTitle() { + float offset = actionsShortcuts.listActions.getCount() * 2.5f; + title.setAttribute("style", "width : calc(100vw - 50px - 2.5em - "+offset+"em);"); + } + + public void removeActionShortcut(ActionItem action) { + actionsShortcuts.removeAction(action.getId(), true); + adjustTitle(); } + public void addActionMenu(ActionItem action) { + actionsMenu.addAction(action); + } + + public void removeActionMenu(ActionItem action) { + actionsMenu.removeAction(action.getId(), true); + } + + public void clearActions() { + actionsShortcuts.clear(); + actionsMenu.clear(); + } @UiHandler("menu") void onMenu(ClickEvent event) { + toogleMenuButton(); SpMobil.getMainPage().toogleMenu(); } @UiHandler("back") void onBack(ClickEvent event) { - PageHistory.getInstance().back(); + if (PageHistory.getInstance().size() > 1) { + PageHistory.getInstance().back(); + } + } + + public void toogleMenuButton() { + if (menu.getStylePrimaryName().equals("active")) { + closeMenuButton(); + } else { + menu.setStylePrimaryName("active"); + } + } + + public void closeMenuButton() { + menu.setStylePrimaryName("not-active"); } public void showOfflineIndicator() { - menu.addStyleName(ressources.css().offline()); + header.addStyleName(ressources.css().offline()); } public void hideOfflineIndicator() { - menu.removeStyleName(ressources.css().offline()); + header.removeStyleName(ressources.css().offline()); } public void setVisibleBackButton(boolean visible) { + // hide menu if not home page + menu.setVisible(!visible); // remove active state header.remove(back); header.add(back); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.ui.xml index 350b2ce31..504b4c51a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.ui.xml @@ -23,13 +23,23 @@ --> <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> -<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" + xmlns:g="urn:import:com.google.gwt.user.client.ui" + xmlns:base="urn:import:org.silverpeas.mobile.client.components.base"> <ui:with field='msg' type='org.silverpeas.mobile.client.resources.ApplicationMessages'/> <g:HTMLPanel ui:field="header"> - <g:Anchor ui:field="menu" styleName="ui-icon-bars"></g:Anchor> + <div class="box"> + <g:HTML ui:field="menu" stylePrimaryName="not-active"> + <span></span> + <span></span> + <span></span> + </g:HTML> + </div> + <g:Anchor ui:field="back" styleName="ui-btn-right back" text=""/> <h1 ui:field="title" class="ui-title">Silverpeas</h1> - <g:Anchor ui:field="back" styleName="ui-btn-right ui-btn-corner-all ui-btn ui-icon-grid ui-shadow back" text="{msg.back}"/> + <base:ActionsList ui:field="actionsShortcuts"/> + <base:ActionsMenu ui:field="actionsMenu"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.java similarity index 66% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.java rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.java index b13e6e846..2448b67f0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.java @@ -22,7 +22,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package org.silverpeas.mobile.client.apps.tasks.pages.widgets; +package org.silverpeas.mobile.client.components.base.widgets; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; @@ -30,33 +30,29 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; -import org.silverpeas.mobile.client.apps.tasks.pages.TaskPage; -import org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages; +import com.google.gwt.user.client.ui.HTMLPanel; +import org.silverpeas.mobile.client.components.base.ActionItem; /** * @author: svu */ -public class AddTaskItem extends Composite { +public class AddButton extends ActionItem { - interface AddTaskItemUiBinder extends UiBinder<Widget, AddTaskItem> { - } + interface AddButtonUiBinder extends UiBinder<HTMLPanel, AddButton> {} - @UiField Anchor link; - @UiField(provided = true) protected TasksMessages msg = null; + private static AddButtonUiBinder uiBinder = GWT.create(AddButtonUiBinder.class); - private static AddTaskItemUiBinder uiBinder = GWT.create(AddTaskItemUiBinder.class); + @UiField + HTMLPanel container; + @UiField + Anchor link; - public AddTaskItem() { - msg = GWT.create(TasksMessages.class); + public AddButton() { initWidget(uiBinder.createAndBindUi(this)); } @UiHandler("link") - void createTask(ClickEvent event) { - TaskPage page = new TaskPage(); - page.setPageTitle(msg.create()); - page.show(); + void delete(ClickEvent event) { + getCallback().execute(); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.ui.xml new file mode 100644 index 000000000..8e183de3b --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.ui.xml @@ -0,0 +1,31 @@ +<!-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "https://www.silverpeas.org/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' + xmlns:g='urn:import:com.google.gwt.user.client.ui'> + + <g:HTMLPanel tag="li" ui:field="container" styleName="add-action"> + <g:Anchor ui:field="link"/> + </g:HTMLPanel> +</ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.java similarity index 64% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.java rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.java index bcdc71893..dc177911b 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.java @@ -22,7 +22,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package org.silverpeas.mobile.client.apps.sharesbox.pages.widgets; +package org.silverpeas.mobile.client.components.base.widgets; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; @@ -31,14 +31,7 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; -import org.silverpeas.mobile.client.apps.sharesbox.events.app.DeleteSharesEvent; -import org.silverpeas.mobile.client.apps.sharesbox.pages.SharesBoxPage; -import org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages; -import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.components.base.ActionItem; -import org.silverpeas.mobile.shared.dto.tickets.TicketDTO; - -import java.util.List; /** * @author: svu @@ -49,35 +42,17 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {} private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class); - private SharesBoxPage parentPage; - @UiField HTMLPanel container; @UiField - Anchor delete; - - @UiField(provided = true) - protected ShareMessages msg = null; - + Anchor link; public DeleteButton() { - msg = GWT.create(ShareMessages.class); initWidget(uiBinder.createAndBindUi(this)); - setId("delete"); } - @UiHandler("delete") + @UiHandler("link") void delete(ClickEvent event) { - List<TicketDTO> selection = parentPage.getSelectedShares(); - DeleteSharesEvent deleteEvent = new DeleteSharesEvent(); - deleteEvent.setSelection(selection); - if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent); - - // hide menu - getElement().getParentElement().removeAttribute("style"); - } - - public void setParentPage(final SharesBoxPage parentPage) { - this.parentPage = parentPage; + getCallback().execute(); } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.ui.xml similarity index 84% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.ui.xml rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.ui.xml index 72d0b4821..e4cc3f063 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.ui.xml @@ -25,9 +25,7 @@ <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'> - <ui:with field='msg' type='org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages'/> - - <g:HTMLPanel tag="li" ui:field="container" styleName=""> - <g:Anchor styleName="" ui:field="delete" text="{msg.delete}"/> + <g:HTMLPanel tag="li" ui:field="container" styleName="delete-action"> + <g:Anchor ui:field="link"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SelectableItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SelectableItem.java new file mode 100644 index 000000000..c8a6a6579 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SelectableItem.java @@ -0,0 +1,89 @@ +package org.silverpeas.mobile.client.components.base.widgets; + +import com.google.gwt.event.dom.client.TouchEndEvent; +import com.google.gwt.event.dom.client.TouchMoveEvent; +import com.google.gwt.event.dom.client.TouchStartEvent; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTMLPanel; +import org.silverpeas.mobile.client.components.base.PageContent; + +public class SelectableItem extends Composite { + + private PageContent parent; + private HTMLPanel container; + private boolean onMove = false; + private boolean unSelected = false; + + private Timer timerSelection = null; + private Timer timerScroll = null; + + public void setParent(PageContent page) { + this.parent = page; + } + + public void setContainer(HTMLPanel container) { + this.container = container; + } + + public boolean isSelected() { + return container.getElement().hasClassName("selected"); + } + + protected void startTouch(TouchStartEvent event, boolean selectable) { + if (!parent.isSelectionMode() && selectable) { + timerSelection = new Timer() { + @Override + public void run() { + parent.setSelectionMode(true); + container.getElement().addClassName("selected"); + parent.changeSelectionNumber(1); + } + }; + timerSelection.schedule(400); + } else if (parent.isSelectionMode() && selectable) { + timerScroll = new Timer() { + @Override + public void run() { + if (!onMove) { + if (container.getElement().hasClassName("selected")) { + container.getElement().removeClassName("selected"); + parent.changeSelectionNumber(-1); + unSelected = true; + } else { + container.getElement().addClassName("selected"); + parent.changeSelectionNumber(1); + } + } else { + onMove = false; + } + } + }; + timerScroll.schedule(100); + } + } + + protected void moveTouch(TouchMoveEvent event) { + if (timerSelection != null) timerSelection.cancel(); + if (timerScroll != null) timerScroll.cancel(); + onMove = true; + } + + protected void endTouch(TouchEndEvent event, boolean selectable, Command onClickAction) { + if (timerSelection != null) timerSelection.cancel(); + if (!onMove) { + if (selectable) { + if (!parent.isSelectionMode() && !unSelected) { + onClickAction.execute(); + } + } else { + onClickAction.execute(); + } + } else { + onMove = false; + } + unSelected = false; + } + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.java new file mode 100644 index 000000000..3681836fc --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.components.base.widgets; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HTMLPanel; +import org.silverpeas.mobile.client.common.Html5Utils; +import org.silverpeas.mobile.client.components.base.ActionItem; +import org.silverpeas.mobile.client.components.base.ActionsMenu; +import org.silverpeas.mobile.client.resources.ApplicationMessages; + +/** + * @author: svu + */ +public class ShareButton extends ActionItem { + interface ShareButtonUiBinder extends UiBinder<HTMLPanel, ShareButton> { + } + + private static ShareButtonUiBinder uiBinder = GWT.create(ShareButtonUiBinder.class); + + @UiField HTMLPanel container; + @UiField Anchor share; + + @UiField(provided = true) protected ApplicationMessages msg = null; + private String title, text, url; + + public ShareButton() { + msg = GWT.create(ApplicationMessages.class); + initWidget(uiBinder.createAndBindUi(this)); + setId("share"); + } + public void init(String title, String text, String url) { + this.title = title; + this.text = text; + this.url = url; + try { + if (!Html5Utils.canShare(title, text, url)) { + setVisible(false); + } + } catch(Throwable t) { + setVisible(false); + } + } + @UiHandler("share") + void share(ClickEvent event) { + Html5Utils.share(title, text, url); + + // hide menu + ActionsMenu.close(getElement()); + } + + + +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.ui.xml similarity index 88% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.ui.xml rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.ui.xml index 472786168..74291968a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.ui.xml @@ -25,9 +25,9 @@ <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'> - <ui:with field='msg' type='org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages'/> + <ui:with field='msg' type='org.silverpeas.mobile.client.resources.ApplicationMessages'/> <g:HTMLPanel tag="li" ui:field="container" styleName=""> - <g:Anchor styleName="" ui:field="delete" text="{msg.delete}"/> + <g:Anchor styleName="" ui:field="share" text="{msg.share}"/> </g:HTMLPanel> </ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java similarity index 53% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.java rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java index 6a1b69793..71755d81e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java @@ -22,63 +22,61 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets; +package org.silverpeas.mobile.client.components.base.widgets; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; -import org.silverpeas.mobile.client.apps.notificationsbox.events.app.DeleteNotificationsEvent; -import org.silverpeas.mobile.client.apps.notificationsbox.pages.NotificationsBoxPage; -import org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages; -import org.silverpeas.mobile.client.common.EventBus; +import org.silverpeas.mobile.client.common.Html5Utils; import org.silverpeas.mobile.client.components.base.ActionItem; -import org.silverpeas.mobile.shared.dto.notifications.NotificationBoxDTO; - -import java.util.List; /** * @author: svu */ -public class DeleteButton extends ActionItem { +public class SpeakButton extends ActionItem { + - interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {} - private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class); + interface SpeakButtonUiBinder extends UiBinder<HTMLPanel, SpeakButton> {} - private NotificationsBoxPage parentPage; + private static SpeakButtonUiBinder uiBinder = GWT.create(SpeakButtonUiBinder.class); + + private Command onEndSpeaking; @UiField HTMLPanel container; @UiField - Anchor delete; - - @UiField(provided = true) - protected NotificationsMessages msg = null; + Anchor link; - - public DeleteButton() { - msg = GWT.create(NotificationsMessages.class); + public SpeakButton() { initWidget(uiBinder.createAndBindUi(this)); - setId("delete"); - } + setId("speak"); - @UiHandler("delete") - void delete(ClickEvent event) { - List<NotificationBoxDTO> selection = parentPage.getSelectedNotification(); - - DeleteNotificationsEvent deleteEvent = new DeleteNotificationsEvent(); - deleteEvent.setSelection(selection); - if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent); + onEndSpeaking = new Command() { + @Override + public void execute() { + onClick(null); + } + }; + } - // hide menu - getElement().getParentElement().removeAttribute("style"); + public Command getEndCallback() { + return onEndSpeaking; } - public void setParentPage(final NotificationsBoxPage parentPage) { - this.parentPage = parentPage; + @UiHandler("link") + void onClick(ClickEvent event) { + if (container.getElement().hasClassName("running")) { + container.getElement().removeClassName("running"); + Html5Utils.cancelSpeaking(); + } else { + container.getElement().addClassName("running"); + getCallback().execute(); + } } } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.ui.xml new file mode 100644 index 000000000..1ffa7c4cd --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.ui.xml @@ -0,0 +1,31 @@ +<!-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "https://www.silverpeas.org/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' + xmlns:g='urn:import:com.google.gwt.user.client.ui'> + + <g:HTMLPanel tag="li" ui:field="container" styleName="speak-action"> + <g:Anchor ui:field="link"/> + </g:HTMLPanel> +</ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java index 8feccd262..bda28421a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java @@ -292,7 +292,12 @@ public void onClick(final ClickEvent clickEvent) { // get users or groups selected before TextArea tx = ((TextArea) clickEvent.getSource()); List<String> ids = Arrays.asList(tx.getElement().getAttribute("data").split(",")); - page.setPreSelectedIds(ids); + if (type.equalsIgnoreCase("user")) { + page.setPreSelectedUsersIds(ids); + } else if (type.equalsIgnoreCase("group")) { + page.setPreSelectedGroupsIds(ids); + } + sendEventToGetPossibleUsers(); page.show(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.java index 2aa5a5e5e..6f774e6b7 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.java @@ -27,6 +27,7 @@ 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.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HTML; @@ -103,6 +104,9 @@ public void setConfig(final Config config) { news.setVisible(config.isNewsDisplay()); freeZoneSection.setVisible(config.isFreeZoneDisplay()); freeZoneThinSection.setVisible(config.isFreeZoneThinDisplay()); + shortCutsSection.setVisible(config.isShortCutsDisplay()); + lastEventsSection.setVisible(config.isLastEventsDisplay()); + shortCutsToolsSection.setVisible(config.isShortCutsToolsDisplay()); } public void setData(HomePageDTO data) { @@ -141,9 +145,12 @@ public void setData(HomePageDTO data) { List<MyLinkDTO> favoritesList = data.getFavorites(); favorisSection.setVisible(!favoritesList.isEmpty() && config.isFavoritesDisplay()); for (MyLinkDTO favoriteDTO : favoritesList) { - FavoriteItem item = new FavoriteItem(); - item.setData(favoriteDTO); - favoris.add(item); + if (favoriteDTO.getVisible()) { + FavoriteItem item = new FavoriteItem(); + item.setMinimalView(true); + item.setData(favoriteDTO); + favoris.add(item); + } } shortcutstools.clear(); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.ui.xml index 2012e3bfb..9ce29683a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.ui.xml @@ -39,27 +39,27 @@ <div id="spaces"> <components:UnorderedList ui:field="spaces" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </div> - <g:HTMLPanel stylePrimaryName="favoris-bloc bloc" ui:field="favorisSection"> + <g:HTMLPanel stylePrimaryName="favoris-bloc bloc" ui:field="favorisSection" visible="false"> <h3 class="title-bloc-part ui-title"><ui:safehtml from="{msg.favorites}"/></h3> <components:UnorderedList ui:field="favoris" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </g:HTMLPanel> - <g:HTMLPanel stylePrimaryName="tools-bloc bloc" ui:field="shortCutsToolsSection"> + <g:HTMLPanel stylePrimaryName="tools-bloc bloc" ui:field="shortCutsToolsSection" visible="false"> <h3 class="title-bloc-part ui-title"><ui:safehtml from="{msg.shortcutstools}"/></h3> <components:UnorderedList ui:field="shortcutstools" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </g:HTMLPanel> - <g:HTMLPanel stylePrimaryName="racourcis-bloc bloc" ui:field="shortCutsSection"> + <g:HTMLPanel stylePrimaryName="racourcis-bloc bloc" ui:field="shortCutsSection" visible="false"> <h3 class="title-bloc-part ui-title"><ui:safehtml from="{msg.shortcuts}"/></h3> <components:UnorderedList ui:field="shortcuts" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </g:HTMLPanel> - <g:HTMLPanel stylePrimaryName="last-publication-bloc bloc" ui:field="lastPublicationsSection"> + <g:HTMLPanel stylePrimaryName="last-publication-bloc bloc" ui:field="lastPublicationsSection" visible="false"> <h3 class="title-bloc-part ui-title"><ui:safehtml from="{msg.lastPublications}"/></h3> <components:UnorderedList ui:field="lastPublications" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </g:HTMLPanel> - <g:HTMLPanel stylePrimaryName="last-event-bloc bloc" ui:field="lastEventsSection"> + <g:HTMLPanel stylePrimaryName="last-event-bloc bloc" ui:field="lastEventsSection" visible="false"> <h3 class="title-bloc-part ui-title"><ui:safehtml from="{msg.lastEvents}"/></h3> <components:UnorderedList ui:field="lastEvents" styleName="ui-listview ui-listview-inset ui-corner-all ui-shadow"/> </g:HTMLPanel> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/UserSelectionPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/UserSelectionPage.java index 52be92ce0..266dfc4b2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/UserSelectionPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/UserSelectionPage.java @@ -35,6 +35,7 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.TextBox; +import org.silverpeas.core.admin.user.model.User; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.app.View; import org.silverpeas.mobile.client.components.UnorderedList; @@ -68,14 +69,21 @@ public class UserSelectionPage extends PageContent private static UserSelectionPageUiBinder uiBinder = GWT.create(UserSelectionPageUiBinder.class); private String contentId; - private List<String> preSelectedIds = new ArrayList<String>(); + private List<String> preSelectedUsersIds = new ArrayList<String>(); + private List<String> preSelectedGroupsIds = new ArrayList<String>(); public void setMaxSelection(final int maxSelection) { this.maxSelection = maxSelection; } - public void setPreSelectedIds(final List<String> preSelectedIds) { - this.preSelectedIds = preSelectedIds; + public void setPreSelectedUsersIds(final List<String> preSelectedUsersIds) { + this.preSelectedUsersIds = preSelectedUsersIds; + if (preSelectedUsersIds != null && !preSelectedUsersIds.isEmpty()) continu.setVisible(true); + } + + public void setPreSelectedGroupsIds(final List<String> preSelectedGroupsIds) { + this.preSelectedGroupsIds = preSelectedGroupsIds; + if (preSelectedGroupsIds != null && !preSelectedGroupsIds.isEmpty()) continu.setVisible(true); } interface UserSelectionPageUiBinder extends UiBinder<HTMLPanel, UserSelectionPage> { @@ -111,10 +119,17 @@ public void onAllowedUsersAndGroupsLoaded(AllowedUsersAndGroupsLoadedEvent allow for (BaseDTO data : allowedUsersAndGroupsLoadedEvent.getListAllowedUsersAndGroups()) { UserGroupItem item = new UserGroupItem(); item.setData(data); - if (preSelectedIds.contains(data.getId())) { - item.select(); + if (data instanceof UserDTO) { + if (preSelectedUsersIds.contains(data.getId())) { + item.select(); + } + list.add(item); + } else if (data instanceof GroupDTO) { + if (preSelectedGroupsIds.contains(data.getId())) { + item.select(); + } + list.add(item); } - list.add(item); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/widgets/UserGroupItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/widgets/UserGroupItem.java index 971c376e7..85101c4af 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/widgets/UserGroupItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/userselection/widgets/UserGroupItem.java @@ -94,7 +94,11 @@ public void setData(BaseDTO data) { } else if (data instanceof GroupDTO) { content.setStylePrimaryName("group-name"); GroupDTO dataGroup = (GroupDTO) data; - content.add(new HTML(dataGroup.getName())); + HTML icon = new HTML(resources.peoples().getText()); + icon.setStylePrimaryName("icon-group"); + content.add(icon); + content.add(new HTML(dataGroup.getName() + " (" + dataGroup.getNbMembers() + ")")); + mail.setVisible(false); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.java index 40ff92761..f31631326 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.java @@ -26,18 +26,13 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; +import com.google.gwt.dom.client.DivElement; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.CheckBox; -import com.google.gwt.user.client.ui.FormPanel; -import com.google.gwt.user.client.ui.ListBox; -import com.google.gwt.user.client.ui.PasswordTextBox; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.*; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.common.AuthentificationManager; import org.silverpeas.mobile.client.common.Notification; @@ -72,6 +67,12 @@ public class ConnexionPage extends PageContent { @UiField CheckBox tooglePasswordView; + @UiField + InlineHTML labelTooglePasswordView; + + @UiField + DivElement version; + public void setAuthenticateError(final AuthenticationException authenticateError) { if (authenticateError == null) { checkCredentials("init","init"); @@ -108,7 +109,8 @@ public ConnexionPage() { form.getElement().setId("formLogin"); form.getElement().setAttribute("autocomplete","off"); - + version.setId("version"); + version.setInnerText(msg.version() + " " + ResourcesManager.getVersion()); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override @@ -140,10 +142,8 @@ void connexion(ClickEvent e) { void changePasswordVisibity(ClickEvent e) { if (passwordField.getElement().getAttribute("type").equals("password")) { passwordField.getElement().setAttribute("type", "text"); - tooglePasswordView.setText(msg.hidePwd()); } else { passwordField.getElement().setAttribute("type", "password"); - tooglePasswordView.setText(msg.showPwd()); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.ui.xml index 213d99955..0a2d8c8d6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.ui.xml +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/connexion/ConnexionPage.ui.xml @@ -44,7 +44,8 @@ <g:PasswordTextBox ui:field="passwordField" name="Password"/> </div> <div id="password-visibility"> - <g:CheckBox ui:field="tooglePasswordView" text="{msg.showPwd}"/> + <g:InlineHTML ui:field="labelTooglePasswordView" text="{msg.showPwd}"/> + <g:CheckBox ui:field="tooglePasswordView" stylePrimaryName="checkbox-wrapper"/> </div> <div id="domain-formLogin"> @@ -60,6 +61,7 @@ <div id="copyright"> <ui:safehtml from="{msg.copyright}"/> </div> + <div ui:field="version"></div> </g:HTMLPanel> </g:FormPanel> </div> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.java new file mode 100644 index 000000000..f5e7c8d2c --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.client.pages.cookies; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Cookies; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Widget; +import org.silverpeas.mobile.client.SpMobil; +import org.silverpeas.mobile.client.common.Notification; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; +import org.silverpeas.mobile.client.components.base.PageContent; +import org.silverpeas.mobile.client.resources.ApplicationMessages; + +import java.util.Date; + + +public class CookiesPage extends PageContent { + + interface CookiesPageUiBinder extends UiBinder<Widget, CookiesPage> {} + + private static CookiesPageUiBinder uiBinder = GWT.create(CookiesPageUiBinder.class); + + @UiField + Anchor accept; + + @UiField + HTML text; + + @UiField(provided = true) + protected ApplicationMessages msg = null; + + public CookiesPage() { + msg = GWT.create(ApplicationMessages.class); + initWidget(uiBinder.createAndBindUi(this)); + SpMobil.getMainPage().hideFooter(); + text.setHTML(msg.cookiesInformation()); + Notification.activityStop(); + } + + @UiHandler("accept") + void accept(ClickEvent e) { + String cookie = Cookies.getCookie("accept_cookies"); + if (cookie == null || cookie.isEmpty()) { + long duration = Long.parseLong(ResourcesManager.getParam("displayCookiesInformationFrequency")); + final long DURATION = 1000 * 60 * 60 * 24 * duration; + Date expires = new Date(System.currentTimeMillis() + DURATION); + Cookies.setCookie("accept_cookies", "accepted", expires); + } + SpMobil.getInstance().loadIds(null); + } + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.ui.xml new file mode 100644 index 000000000..5287bacae --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.ui.xml @@ -0,0 +1,47 @@ +<!-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "https://www.silverpeas.org/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" + xmlns:g="urn:import:com.google.gwt.user.client.ui"> + + <ui:with field='msg' + type='org.silverpeas.mobile.client.resources.ApplicationMessages' /> + + <g:HTMLPanel> + <div id="header"> + <h1 id="page-infos-title"><ui:safehtml from="{msg.informationTitle}"/></h1> + </div> + + <div id="page-infos" class="ui-content ui-body-a"> + <div class="infosTextContainer"> + <g:HTML ui:field="text" styleName="infosText"></g:HTML> + <div class="infosTextActions"> + <g:Anchor ui:field="accept" styleName="btn-validate ui-link smaller multiple"><ui:safehtml from="{msg.accept}"/></g:Anchor> + </div> + </div> + </div> + </g:HTMLPanel> + +</ui:UiBinder> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/main/HomePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/main/HomePage.java index be4370d62..d45617c8a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/main/HomePage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/pages/main/HomePage.java @@ -92,6 +92,7 @@ public HomePageContent getContent() { @Override public void clickItem(final ClickItemEvent event) { if (isVisible()) { + SpMobil.getMainPage().closeMenu(); if (event.getData() instanceof SpaceDTO) { SpaceDTO space = (SpaceDTO) event.getData(); if (space.getHomePageType() == HomePages.SILVERPEAS.getValue() || diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java index ad8912eb8..f1d1b85f1 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java @@ -29,6 +29,10 @@ public interface ApplicationMessages extends Messages { + + @DefaultMessage("Pour son fonctionnement, cette application utilise des Cookies. Les informations stockées sont uniquement techniques et ne contiennent pas de données personnelles, ou de suivi.") + SafeHtml cookiesInformation(); + @DefaultMessage("Login") SafeHtml loginLabel(); @@ -38,6 +42,9 @@ public interface ApplicationMessages extends Messages { @DefaultMessage("Silverpeas > Ecran de connexion") SafeHtml loginTitle(); + @DefaultMessage("Information") + SafeHtml informationTitle(); + @DefaultMessage("Confirmer") String confirmBtnLabel(); @DefaultMessage("Annuler") @@ -45,7 +52,7 @@ public interface ApplicationMessages extends Messages { @DefaultMessage("Corriger") String correctBtnLabel(); - @DefaultMessage("© 2001-2020 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés") + @DefaultMessage("© 2001-2024 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés") SafeHtml copyright(); @DefaultMessage("Parcourir la plateforme") @@ -92,7 +99,10 @@ public interface ApplicationMessages extends Messages { @DefaultMessage("Espace personnel") String personalSpace(); - @Messages.DefaultMessage("Modifier mon statut") + @DefaultMessage("Mes documents") + String myDocuments(); + + @DefaultMessage("Modifier mon statut") String editStatus(); @DefaultMessage("Contenus trouvés") @@ -179,10 +189,6 @@ public interface ApplicationMessages extends Messages { @DefaultMessage("Afficher le mot de passe") String showPwd(); - - @DefaultMessage("Masquer le mot de passe") - String hidePwd(); - @DefaultMessage("Reçues") SafeHtml received(); @@ -191,4 +197,13 @@ public interface ApplicationMessages extends Messages { @DefaultMessage("Mes partages") String shares(); + + @DefaultMessage("Partager") + String share(); + + @DefaultMessage("Autres favoris") + String favoritesWithoutCategory(); + + @DefaultMessage("Version") + String version(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties index a767e209a..aa125a752 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties @@ -22,15 +22,16 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +cookiesInformation=For its operation, this application uses cookies. The stored information is solely technical and does not contain personal data or tracking information. loginLabel=Login passwordLabel=Password loginTitle=Silverpeas > Login screen - +informationTitle=Information confirmBtnLabel=Confirm cancelBtnLabel=Cancel correctBtnLabel=Correct -copyright=© 2001-2016 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - All rights reserved +copyright=© 2001-2024 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - All rights reserved infoTitle=Information ok=OK @@ -44,6 +45,7 @@ tasks=My tasks disconnect=Log out personalSpace=Personal space +myDocuments=My documents editStatus=Edit my status @@ -77,9 +79,14 @@ notifications=My notifications pwdNotValid=Password is not valid showPwd=Show password -hidePwd=Hide password received=Received sended=Sended -notfoundError=Ressource not found \ No newline at end of file +notfoundError=Ressource not found + +share=Share + +favoritesWithoutCategory=Others favorites + +version=Version \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties index f996678fa..2f3c417fe 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties @@ -22,14 +22,17 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +cookiesInformation=Pour son fonctionnement, cette application utilise des Cookies. Les informations stockées sont uniquement techniques et ne contiennent pas de données personnelles, ou de suivi. + loginLabel=Login passwordLabel=Mot de passe loginTitle=Silverpeas > Ecran de connexion +informationTitle=Information confirmBtnLabel=Confirmer cancelBtnLabel=Annuler correctBtnLabel=Corriger -copyright=© 2001-2016 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés +copyright=© 2001-2024 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés infoTitle=Information ok=OK @@ -45,6 +48,7 @@ tasks=Mes tâches disconnect=Déconnexion personalSpace=Espace personnel +myDocuments=Mes documents editStatus=Modifier mon statut results=Contenus trouvés @@ -80,9 +84,14 @@ notifications=Mes notifications pwdNotValid=Le mot de passe ne respecte pas les consignes de sécurité showPwd=Afficher le mot de passe -hidePwd=Masquer le mot de passe received=Reçues sended=Envoyées -notfoundError=Ressource non trouv�e \ No newline at end of file +notfoundError=Ressource non trouv�e + +share=Partager + +favoritesWithoutCategory=Autres favoris + +version=Version \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java index b38268825..5e1d8c4fe 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java @@ -25,7 +25,9 @@ package org.silverpeas.mobile.client.resources; import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.DataResource; import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.TextResource; /** * @author: svu @@ -35,18 +37,158 @@ public interface ApplicationResources extends ClientBundle { @Source("application.css") ApplicationCSS css(); - @Source("avatar.png") + @Source("icons/avatar.png") ImageResource avatar(); - @Source("sound.png") - ImageResource sound(); + @Source("icons/offline.png") + ImageResource offline(); - @Source("video.png") - ImageResource video(); + @Source("icons/star.svg") + @DataResource.MimeType("image/svg+xml") + TextResource favorite(); - @Source("streaming.png") - ImageResource streaming(); + @Source("icons/expand_more.svg") + @DataResource.MimeType("image/svg+xml") + TextResource more(); - @Source("offline.png") - ImageResource offline(); + @Source("icons/expand_less.svg") + @DataResource.MimeType("image/svg+xml") + TextResource less(); + + @Source("icons/call.svg") + @DataResource.MimeType("image/svg+xml") + TextResource call(); + + @Source("icons/sms.svg") + @DataResource.MimeType("image/svg+xml") + TextResource sms(); + + @Source("icons/peoples.svg") + @DataResource.MimeType("image/svg+xml") + TextResource peoples(); + + + /** Applications icons **/ + + @Source("icons/apps/blog.svg") + @DataResource.MimeType("image/svg+xml") + TextResource blog(); + + @Source("icons/apps/news.svg") + @DataResource.MimeType("image/svg+xml") + TextResource news(); + + @Source("icons/apps/calendar.svg") + @DataResource.MimeType("image/svg+xml") + TextResource calendar(); + + @Source("icons/apps/webpage.svg") + @DataResource.MimeType("image/svg+xml") + TextResource webpage(); + + @Source("icons/apps/ged.svg") + @DataResource.MimeType("image/svg+xml") + TextResource ged(); + + @Source("icons/apps/media_library.svg") + @DataResource.MimeType("image/svg+xml") + TextResource mediaLib(); + + @Source("icons/apps/link.svg") + @DataResource.MimeType("image/svg+xml") + TextResource link(); + + @Source("icons/apps/classifieds.svg") + @DataResource.MimeType("image/svg+xml") + TextResource classifieds(); + + @Source("icons/apps/faq.svg") + @DataResource.MimeType("image/svg+xml") + TextResource faq(); + + @Source("icons/apps/form.svg") + @DataResource.MimeType("image/svg+xml") + TextResource form(); + + @Source("icons/apps/book_online.svg") + @DataResource.MimeType("image/svg+xml") + TextResource bookonline(); + + @Source("icons/apps/poll.svg") + @DataResource.MimeType("image/svg+xml") + TextResource poll(); + + @Source("icons/apps/quiz.svg") + @DataResource.MimeType("image/svg+xml") + TextResource quizz(); + + @Source("icons/apps/workflow.svg") + @DataResource.MimeType("image/svg+xml") + TextResource workflow(); + + /** Applications images ressources **/ + + @Source("icons/apps/ged/folder.svg") + @DataResource.MimeType("image/svg+xml") + TextResource folder(); + + @Source("icons/apps/ged/trash.svg") + @DataResource.MimeType("image/svg+xml") + TextResource trash(); + + @Source("icons/apps/ged/publication.svg") + @DataResource.MimeType("image/svg+xml") + TextResource publication(); + + @Source("icons/shortcuts/home_shortcut.svg") + @DataResource.MimeType("image/svg+xml") + TextResource homeShortcut(); + + @Source("icons/shortcuts/favorites_shortcut.svg") + @DataResource.MimeType("image/svg+xml") + TextResource favoritesShortcut(); + + @Source("icons/shortcuts/contacts_shortcut.svg") + @DataResource.MimeType("image/svg+xml") + TextResource contactsShortcut(); + + @Source("icons/shortcuts/tasks_shortcut.svg") + @DataResource.MimeType("image/svg+xml") + TextResource tasksShortcut(); + + @Source("icons/shortcuts/chat_shortcut.svg") + @DataResource.MimeType("image/svg+xml") + TextResource chatShortcut(); + @Source("icons/menu/help.svg") + @DataResource.MimeType("image/svg+xml") + TextResource help(); + + @Source("icons/menu/settings.svg") + @DataResource.MimeType("image/svg+xml") + TextResource settings(); + + @Source("icons/menu/home.svg") + @DataResource.MimeType("image/svg+xml") + TextResource home(); + + @Source("icons/menu/logout.svg") + @DataResource.MimeType("image/svg+xml") + TextResource logout(); + + @Source("icons/menu/usercalendar.svg") + @DataResource.MimeType("image/svg+xml") + TextResource usercalendar(); + + @Source("icons/menu/sharebox.svg") + @DataResource.MimeType("image/svg+xml") + TextResource sharebox(); + + @Source("icons/menu/inbox.svg") + @DataResource.MimeType("image/svg+xml") + TextResource inbox(); + + @Source("icons/menu/search.svg") + @DataResource.MimeType("image/svg+xml") + TextResource search(); } + diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/application.css b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/application.css index 86551fd1e..e06fd4c29 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/application.css +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/application.css @@ -27,4 +27,6 @@ overflow: inherit; height: inherit; width: inherit; + background-position-x: -5px; + background-position-y: -5px; } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/blog.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/blog.svg new file mode 100644 index 000000000..b3be43d4a --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/blog.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M560-564v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-600q-38 0-73 9.5T560-564Zm0 220v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-380q-38 0-73 9t-67 27Zm0-110v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-490q-38 0-73 9.5T560-454ZM260-320q47 0 91.5 10.5T440-278v-394q-41-24-87-36t-93-12q-36 0-71.5 7T120-692v396q35-12 69.5-18t70.5-6Zm260 42q44-21 88.5-31.5T700-320q36 0 70.5 6t69.5 18v-396q-33-14-68.5-21t-71.5-7q-47 0-93 12t-87 36v394Zm-40 118q-48-38-104-59t-116-21q-42 0-82.5 11T100-198q-21 11-40.5-1T40-234v-482q0-11 5.5-21T62-752q46-24 96-36t102-12q58 0 113.5 15T480-740q51-30 106.5-45T700-800q52 0 102 12t96 36q11 5 16.5 15t5.5 21v482q0 23-19.5 35t-40.5 1q-37-20-77.5-31T700-240q-60 0-116 21t-104 59ZM280-494Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/book_online.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/book_online.svg new file mode 100644 index 000000000..19fca0725 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/book_online.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><rect fill="none" height="24" width="24"/><g><path d="M17,1H7C5.9,1,5,1.9,5,3v18c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V3C19,1.9,18.1,1,17,1z M7,18V6h10v12H7z M16,11V9.14 C16,8.51,15.55,8,15,8H9C8.45,8,8,8.51,8,9.14l0,1.96c0.55,0,1,0.45,1,1c0,0.55-0.45,1-1,1l0,1.76C8,15.49,8.45,16,9,16h6 c0.55,0,1-0.51,1-1.14V13c-0.55,0-1-0.45-1-1C15,11.45,15.45,11,16,11z M12.5,14.5h-1v-1h1V14.5z M12.5,12.5h-1v-1h1V12.5z M12.5,10.5h-1v-1h1V10.5z"/></g></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/calendar.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/calendar.svg new file mode 100644 index 000000000..d628db86d --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/calendar.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/classifieds.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/classifieds.svg new file mode 100644 index 000000000..c7605a5e8 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/classifieds.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-80q-33 0-56.5-23.5T200-160q0-33 23.5-56.5T280-240q33 0 56.5 23.5T360-160q0 33-23.5 56.5T280-80Zm400 0q-33 0-56.5-23.5T600-160q0-33 23.5-56.5T680-240q33 0 56.5 23.5T760-160q0 33-23.5 56.5T680-80ZM246-720l96 200h280l110-200H246Zm-38-80h590q23 0 35 20.5t1 41.5L692-482q-11 20-29.5 31T622-440H324l-44 80h480v80H280q-45 0-68-39.5t-2-78.5l54-98-144-304H40v-80h130l38 80Zm134 280h280-280Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/faq.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/faq.svg new file mode 100644 index 000000000..10b5689af --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/faq.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/form.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/form.svg new file mode 100644 index 000000000..8ce6b0557 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/form.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 5v14H5V5h14m1.1-2H3.9c-.5 0-.9.4-.9.9v16.2c0 .4.4.9.9.9h16.2c.4 0 .9-.5.9-.9V3.9c0-.5-.5-.9-.9-.9zM11 7h6v2h-6V7zm0 4h6v2h-6v-2zm0 4h6v2h-6zM7 7h2v2H7zm0 4h2v2H7zm0 4h2v2H7z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged.svg new file mode 100644 index 000000000..72a671828 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/folder.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/folder.svg new file mode 100644 index 000000000..72a671828 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/folder.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/publication.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/publication.svg new file mode 100644 index 000000000..f720a0c46 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/publication.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h360l200 200v520q0 33-23.5 56.5T720-80H240Zm0-80h480v-480H560v-160H240v640Zm240-40q67 0 113.5-47T640-360v-160h-80v160q0 33-23 56.5T480-280q-33 0-56.5-23.5T400-360v-220q0-9 6-14.5t14-5.5q9 0 14.5 5.5T440-580v220h80v-220q0-42-29-71t-71-29q-42 0-71 29t-29 71v220q0 66 47 113t113 47ZM240-800v160-160 640-640Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/trash.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/trash.svg new file mode 100644 index 000000000..560d174b9 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/trash.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/link.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/link.svg new file mode 100644 index 000000000..50ce54c18 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/link.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/media_library.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/media_library.svg new file mode 100644 index 000000000..f8b20debe --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/media_library.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/news.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/news.svg new file mode 100644 index 000000000..e6ecbc14e --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/news.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-280q17 0 28.5-11.5T320-320q0-17-11.5-28.5T280-360q-17 0-28.5 11.5T240-320q0 17 11.5 28.5T280-280Zm-40-160h80v-240h-80v240Zm200 160h280v-80H440v80Zm0-160h280v-80H440v80Zm0-160h280v-80H440v80ZM160-120q-33 0-56.5-23.5T80-200v-560q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v560q0 33-23.5 56.5T800-120H160Zm0-80h640v-560H160v560Zm0 0v-560 560Z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/poll.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/poll.svg new file mode 100644 index 000000000..68dc07849 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/poll.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/quiz.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/quiz.svg new file mode 100644 index 000000000..ca289cb99 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/quiz.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><path d="M0,0h24v24H0V0z" fill="none"/></g><g><g><path d="M4,6H2v14c0,1.1,0.9,2,2,2h14v-2H4V6z"/><path d="M20,2H8C6.9,2,6,2.9,6,4v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C22,2.9,21.1,2,20,2z M14.01,15 c-0.59,0-1.05-0.47-1.05-1.05c0-0.59,0.47-1.04,1.05-1.04c0.59,0,1.04,0.45,1.04,1.04C15.04,14.53,14.6,15,14.01,15z M16.51,8.83 c-0.63,0.93-1.23,1.21-1.56,1.81c-0.13,0.24-0.18,0.4-0.18,1.18h-1.52c0-0.41-0.06-1.08,0.26-1.65c0.41-0.73,1.18-1.16,1.63-1.8 c0.48-0.68,0.21-1.94-1.14-1.94c-0.88,0-1.32,0.67-1.5,1.23l-1.37-0.57C11.51,5.96,12.52,5,13.99,5c1.23,0,2.08,0.56,2.51,1.26 C16.87,6.87,17.08,7.99,16.51,8.83z"/></g></g></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/webpage.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/webpage.svg new file mode 100644 index 000000000..1265c26da --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/webpage.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-280h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm-80 480q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/workflow.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/workflow.svg new file mode 100644 index 000000000..3c0669d29 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/workflow.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M400-80v-164l294-292q12-12 26.5-18t30.5-6q16 0 30.5 6t26.5 18l49 50q11 12 17 26.5t6 29.5q0 15-6.5 29.5T856-374L564-80H400Zm397-348-50-49 50 49ZM480-160h50l162-162-25-25-25-25-162 162v50Zm187-187-25-25 25 25 25 25-25-25ZM430-590l-56-57 73-73H313q-9 26-28 45t-45 28v334q35 13 57.5 43.5T320-200q0 50-35 85t-85 35q-50 0-85-35t-35-85q0-39 22.5-69t57.5-43v-335q-35-13-57.5-43.5T80-760q0-50 35-85t85-35q39 0 69.5 22.5T313-800h134l-73-73 56-57 170 170-170 170Zm330-290q50 0 85 35t35 85q0 50-35 85t-85 35q-50 0-85-35t-35-85q0-50 35-85t85-35ZM200-160q17 0 28.5-11.5T240-200q0-17-11.5-28.5T200-240q-17 0-28.5 11.5T160-200q0 17 11.5 28.5T200-160Zm0-560q17 0 28.5-11.5T240-760q0-17-11.5-28.5T200-800q-17 0-28.5 11.5T160-760q0 17 11.5 28.5T200-720Zm560 0q17 0 28.5-11.5T800-760q0-17-11.5-28.5T760-800q-17 0-28.5 11.5T720-760q0 17 11.5 28.5T760-720ZM200-200Zm0-560Zm560 0Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/avatar.png b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/avatar.png similarity index 100% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/resources/avatar.png rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/avatar.png diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/call.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/call.svg new file mode 100644 index 000000000..08df7f11e --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/call.svg @@ -0,0 +1 @@ +<svg height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20.01 15.38c-1.23 0-2.42-.2-3.53-.56-.35-.12-.74-.03-1.01.24l-1.57 1.97c-2.83-1.35-5.48-3.9-6.89-6.83l1.95-1.66c.27-.28.35-.67.24-1.02-.37-1.11-.56-2.3-.56-3.53 0-.54-.45-.99-.99-.99H4.19C3.65 3 3 3.24 3 3.99 3 13.28 10.73 21 20.01 21c.71 0 .99-.63.99-1.18v-3.45c0-.54-.45-.99-.99-.99z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_less.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_less.svg new file mode 100644 index 000000000..2d2595701 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_less.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_more.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_more.svg new file mode 100644 index 000000000..c55bd7ff5 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_more.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/help.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/help.svg new file mode 100644 index 000000000..3c5cd4aae --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/help.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/home.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/home.svg new file mode 100644 index 000000000..b7e227a3e --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/home.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/inbox.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/inbox.svg new file mode 100644 index 000000000..ed6363627 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/inbox.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M19 3H4.99c-1.11 0-1.98.89-1.98 2L3 19c0 1.1.88 2 1.99 2H19c1.1 0 2-.9 2-2V5c0-1.11-.9-2-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H4.99V5H19v10z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/logout.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/logout.svg new file mode 100644 index 000000000..fe0a49072 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/logout.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"><path d="M0 0h24v24H0z" fill="none"/><path d="M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/search.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/search.svg new file mode 100644 index 000000000..7c2111eb7 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/search.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/settings.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/settings.svg new file mode 100644 index 000000000..e40c8496e --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/settings.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><path d="M0,0h24v24H0V0z" fill="none"/><path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/></g></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/sharebox.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/sharebox.svg new file mode 100644 index 000000000..07fc6639e --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/sharebox.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/usercalendar.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/usercalendar.svg new file mode 100644 index 000000000..c482b90b9 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/usercalendar.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/offline.png b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/offline.png similarity index 100% rename from mobile-war/src/main/java/org/silverpeas/mobile/client/resources/offline.png rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/offline.png diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/peoples.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/peoples.svg new file mode 100644 index 000000000..0d0dbf821 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/peoples.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><rect fill="none" height="24" width="24"/></g><g><g/><g><g><path d="M16.67,13.13C18.04,14.06,19,15.32,19,17v3h4v-3 C23,14.82,19.43,13.53,16.67,13.13z" fill-rule="evenodd" fill="#7eb73b"/></g><g><circle cx="9" cy="8" fill-rule="evenodd" fill="#7eb73b" r="4"/></g><g><path d="M15,12c2.21,0,4-1.79,4-4c0-2.21-1.79-4-4-4c-0.47,0-0.91,0.1-1.33,0.24 C14.5,5.27,15,6.58,15,8s-0.5,2.73-1.33,3.76C14.09,11.9,14.53,12,15,12z" fill-rule="evenodd" fill="#7eb73b"/></g><g><path d="M9,13c-2.67,0-8,1.34-8,4v3h16v-3C17,14.34,11.67,13,9,13z" fill-rule="evenodd" fill="#7eb73b"/></g></g></g></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/chat_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/chat_shortcut.svg new file mode 100644 index 000000000..b4af4b1bf --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/chat_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 9h12v2H6V9zm8 5H6v-2h8v2zm4-6H6V6h12v2z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/contacts_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/contacts_shortcut.svg new file mode 100644 index 000000000..83277867a --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/contacts_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z" fill="none"/><path d="M20 0H4v2h16V0zM4 24h16v-2H4v2zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25S9.75 10.24 9.75 9 10.76 6.75 12 6.75zM17 17H7v-1.5c0-1.67 3.33-2.5 5-2.5s5 .83 5 2.5V17z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/favorites_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/favorites_shortcut.svg new file mode 100644 index 000000000..d090bc060 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/favorites_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/home_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/home_shortcut.svg new file mode 100644 index 000000000..341070110 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/home_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/tasks_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/tasks_shortcut.svg new file mode 100644 index 000000000..704516259 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/tasks_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px"><rect fill="none" height="24" width="24"/><path d="M11,7H2v2h9V7z M11,15H2v2h9V15z M16.34,11l-3.54-3.54l1.41-1.41l2.12,2.12l4.24-4.24L22,5.34L16.34,11z M16.34,19 l-3.54-3.54l1.41-1.41l2.12,2.12l4.24-4.24L22,13.34L16.34,19z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/sms.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/sms.svg new file mode 100644 index 000000000..c9f8ac0be --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/sms.svg @@ -0,0 +1 @@ +<svg height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM9 11H7V9h2v2zm4 0h-2V9h2v2zm4 0h-2V9h2v2z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/star.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/star.svg new file mode 100644 index 000000000..dcd73881f --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/star.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M0 0h24v24H0z" fill="none"/><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z" fill="#a9a9a9"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/sound.png b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/sound.png deleted file mode 100644 index 53069e667..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/sound.png and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/streaming.png b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/streaming.png deleted file mode 100644 index 0b09eb084..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/streaming.png and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/video.png b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/video.png deleted file mode 100644 index c18a57fde..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/video.png and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css new file mode 100644 index 000000000..c81d45d74 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css @@ -0,0 +1,48 @@ +.closing-page { + transition: transform 300ms; + transform: translateX(+100%); +} + +.opening-page { + transition: transform 300ms; + transform: translateX(-100%); +} + +.open-qvf-menu { + opacity: 1.0; + transition: opacity 250ms linear; +} + +.closed-qvf-menu { + opacity: 0.0; + transition: opacity 250ms linear; +} + +.ripple { + position: absolute; + border-radius: 50%; + /* To make it round */ + background-color: rgba(0, 0, 0, 0.3); + + width: 100px; + height: 100px; + margin-top: -50px; + /* for positioning */ + margin-left: -50px; + + animation: ripple 1s; + opacity: 0; +} + +/* Add animation */ +@keyframes ripple { + from { + opacity: 1; + transform: scale(0); + } + + to { + opacity: 0; + transform: scale(10); + } +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css new file mode 100644 index 000000000..b4627bf57 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css @@ -0,0 +1,211 @@ + +/** Checkbox **********************************************************************************************************/ + +.checkbox-wrapper { + display : inline-grid; + vertical-align : middle; +} + +.checkbox-wrapper input[type=checkbox] { + height: 0; + width: 0; + display: none; +} + +.checkbox-wrapper label { + --size: 4em; + + cursor: pointer; + width: var(--size); + height: calc(var(--size) / 2); + background: black; + display: block; + border-radius: 0.25em; + position: relative; +} + +.checkbox-wrapper label:after { + content: ''; + position: absolute; + top: 6%; + left: 2.5%; + width: calc(50% - 5%); + height: calc(100% - 10%); + background: #fff; + border-radius: 0.25em; + transition: 0.3s; +} + +.checkbox-wrapper input:checked + label { + /*background: #bada55;*/ + background: linear-gradient(#7eb73a, #6fa800) repeat scroll 0 0 #6fa800; +} + +.checkbox-wrapper input:checked + label:after { + left: calc(100% - 2.5%); + transform: translateX(-100%); +} + +.checkbox-wrapper label:active:after { + width: 55%; +} + +/** Menu **************************************************************************************************************/ + +#header > .box { + border-radius: 2px; + position: absolute; + left:12px; + top:12px; + width: 30px; + height: 30px; +} + + +#header > div > div > span { + display: block; + width: 100%; + box-shadow: 0 2px 10px 0 rgba(0,0,0,0.3); + border-radius: 1px; + height: 4px; + background: #fff; + transition: all .3s; + position: relative; +} + +#header > div > div > span + span { + margin-top: 5px; +} + +.active span:nth-child(1) { + animation: ease .7s top forwards; +} + +.not-active span:nth-child(1) { + animation: ease .7s top-2 forwards; +} + +.active span:nth-child(2) { + animation: ease .7s scaled forwards; +} + +.not-active span:nth-child(2) { + animation: ease .7s scaled-2 forwards; +} + +.active span:nth-child(3) { + animation: ease .7s bottom forwards; +} + +.not-active span:nth-child(3) { + animation: ease .7s bottom-2 forwards; +} + +@keyframes top { + 0% { + top: 0; + transform: rotate(0); + } + 50% { + top: 9px;; + transform: rotate(0); + } + 100% { + top: 9px;; + transform: rotate(45deg); + } +} + +@keyframes top-2 { + 0% { + top: 9px;; + transform: rotate(45deg); + } + 50% { + top: 9px;; + transform: rotate(0deg); + } + 100% { + top: 0; + transform: rotate(0deg); + } +} + +@keyframes bottom { + 0% { + bottom: 0; + transform: rotate(0); + } + 50% { + bottom: 9px;; + transform: rotate(0); + } + 100% { + bottom: 9px;; + transform: rotate(135deg); + } +} + +@keyframes bottom-2 { + 0% { + bottom: 9px;; + transform: rotate(135deg); + } + 50% { + bottom: 9px;; + transform: rotate(0); + } + 100% { + bottom: 0; + transform: rotate(0); + } +} + +@keyframes scaled { + 50% { + transform: scale(0); + } + 100% { + transform: scale(0); + } +} + +@keyframes scaled-2 { + 0% { + transform: scale(0); + } + 50% { + transform: scale(0); + } + 100% { + transform: scale(1); + } +} + +/***** Range input ***************/ + +input[type="range"] { + height: 5px; + -webkit-appearance: none; + background: rgb(197, 197, 197); + outline: none; + color: rgb(197, 197, 197); + +} +input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; + width: 25px; + height: 25px; + border-radius: 50%; + background: #6fa800; + cursor: pointer; +} + +.readonly input[type="range"] { + height: 1em; +} + +.readonly input[type="range"]::-webkit-slider-thumb { + width: 0px; + height: 0px; +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/download.png b/mobile-war/src/main/java/org/silverpeas/mobile/public/download.png deleted file mode 100644 index 5b3c0cf54..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/public/download.png and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/forbidden-download.png b/mobile-war/src/main/java/org/silverpeas/mobile/public/forbidden-download.png deleted file mode 100644 index 08b80dd3d..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/public/forbidden-download.png and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/account.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/account.svg new file mode 100644 index 000000000..c984876f5 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/account.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1H6v-1z" fill="black"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/add.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/add.svg new file mode 100644 index 000000000..62c119a4f --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/add.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_back.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_back.svg new file mode 100644 index 000000000..a7d784dfd --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_back.svg @@ -0,0 +1,4 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"> + <path d="M0 0h36v36h-36z" fill="none"/> + <path d="M30 16.5h-18.26l8.38-8.38-2.12-2.12-12 12 12 12 2.12-2.12-8.38-8.38h18.26v-3z" fill="#fff"/> +</svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_forward.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_forward.svg new file mode 100644 index 000000000..97e1aaff4 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_forward.svg @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="24" + viewBox="0 0 24 24" + width="24" + version="1.1" + id="svg2" + sodipodi:docname="expand_less.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs2" /> + <sodipodi:namedview + id="namedview2" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" /> + <path + d="M 0,0 H 24 V 24 H 0 Z" + fill="none" + id="path1" /> + <path + d="m 15.705,11.705 -6,-6 -1.41,1.41 4.58,4.59 -4.58,4.59 1.41,1.41 z" + id="path2" /> +</svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar_today.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar_today.svg new file mode 100644 index 000000000..5bbe6a941 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar_today.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V8h16v13z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/comment.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/comment.svg new file mode 100644 index 000000000..21792818f --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/comment.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18zM18 14H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts.svg new file mode 100644 index 000000000..3bd94fcdc --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z" fill="none"/><path d="M20 0H4v2h16V0zM4 24h16v-2H4v2zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25S9.75 10.24 9.75 9 10.76 6.75 12 6.75zM17 17H7v-1.5c0-1.67 3.33-2.5 5-2.5s5 .83 5 2.5V17z" fill="back"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/delete.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/delete.svg new file mode 100644 index 000000000..560d174b9 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/delete.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/download.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/download.svg new file mode 100644 index 000000000..c4ec1c354 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/download.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><rect fill="none" height="24" width="24"/></g><g><path d="M5,20h14v-2H5V20z M19,9h-4V3H9v6H5l7,7L19,9z"/></g></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/edit.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/edit.svg new file mode 100644 index 000000000..13586f290 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/edit.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="18px" viewBox="0 0 24 24" width="18px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/event.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/event.svg new file mode 100644 index 000000000..5bbe6a941 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/event.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V8h16v13z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_less.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_less.svg new file mode 100644 index 000000000..2d2595701 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_less.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_more.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_more.svg new file mode 100644 index 000000000..c55bd7ff5 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_more.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-calc.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-calc.svg new file mode 100644 index 000000000..0eaca9f52 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-calc.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"><path fill="#107c41" d="M21.818 0a.795.795 0 0 0-.74.469a.78.78 0 0 0 .172.849l6.646 6.661a.811.811 0 0 0 .849.177a.792.792 0 0 0 .484-.708V.771A.807.807 0 0 0 28.448 0zM3.547 0a.787.787 0 0 0-.776.786v30.427c0 .432.349.781.776.786h24.896a.789.789 0 0 0 .786-.786V11.619a.792.792 0 0 0-.229-.557L18.234.244a.799.799 0 0 0-.563-.245zm.786 1.578h13.005l10.313 10.359v18.484H4.333z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-excel.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-excel.svg new file mode 100644 index 000000000..0249b58c8 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-excel.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24"><path fill="#107c41" d="M21.17 3.25q.33 0 .59.25q.24.24.24.58v15.84q0 .34-.24.58q-.26.25-.59.25H7.83q-.33 0-.59-.25q-.24-.24-.24-.58V17H2.83q-.33 0-.59-.24Q2 16.5 2 16.17V7.83q0-.33.24-.59Q2.5 7 2.83 7H7V4.08q0-.34.24-.58q.26-.25.59-.25M7 13.06l1.18 2.22h1.79L8 12.06l1.93-3.17H8.22L7.13 10.9l-.04.06l-.03.07q-.26-.53-.56-1.07q-.25-.53-.53-1.07H4.16l1.89 3.19L4 15.28h1.78m8.1 4.22V17H8.25v2.5m5.63-3.75v-3.12H12v3.12m1.88-4.37V8.25H12v3.13M13.88 7V4.5H8.25V7m12.5 12.5V17h-5.62v2.5m5.62-3.75v-3.12h-5.62v3.12m5.62-4.37V8.25h-5.62v3.13M20.75 7V4.5h-5.62V7Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-image.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-image.svg new file mode 100644 index 000000000..8a02d8ab5 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-image.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="#eb6a05" d="m5 11.1l2-2l5.5 5.5l3.5-3.5l3 3V5H5zM4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1m11.5 7a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-pdf.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-pdf.svg new file mode 100644 index 000000000..01c65b553 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-pdf.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" d="M4.998 9V1H19.5L23 4.5V23H4M18 1v5h5M3 12h1.5c2 0 2.25 1.25 2.25 2s-.25 2-2.25 2H3.25v2H3zm6.5 6v-6h1.705c1.137 0 2.295.5 2.295 3s-1.158 3-2.295 3zm7 1v-7h4m-4 3.5h3"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-powerpoint.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-powerpoint.svg new file mode 100644 index 000000000..aa9ee2d3a --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-powerpoint.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24"><path fill="#d35230" d="M13.5 1.5q1.453 0 2.795.375q1.342.375 2.508 1.06q1.166.686 2.12 1.641q.956.955 1.641 2.121q.686 1.166 1.061 2.508Q24 10.547 24 12q0 1.453-.375 2.795q-.375 1.342-1.06 2.508q-.686 1.166-1.641 2.12q-.955.956-2.121 1.641q-1.166.686-2.508 1.061q-1.342.375-2.795.375q-1.29 0-2.52-.305q-1.23-.304-2.337-.884q-1.108-.58-2.063-1.418q-.955-.838-1.693-1.893H.997q-.411 0-.704-.293T0 17.004V6.996q0-.41.293-.703T.996 6h3.89q.739-1.055 1.694-1.893q.955-.837 2.063-1.418q1.107-.58 2.337-.884Q12.21 1.5 13.5 1.5m.75 1.535v8.215h8.215q-.14-1.64-.826-3.076q-.686-1.436-1.782-2.531q-1.095-1.096-2.537-1.782q-1.441-.685-3.07-.826m-5.262 7.57q0-.68-.228-1.166q-.229-.486-.627-.79q-.399-.305-.938-.446q-.539-.14-1.172-.14H2.848v7.863h1.84v-2.742H5.93q.574 0 1.119-.17t.978-.493q.434-.322.698-.802q.263-.48.263-1.114M13.5 21q1.172 0 2.262-.287t2.056-.82q.967-.534 1.776-1.278q.808-.744 1.418-1.664q.61-.92.984-1.986q.375-1.067.469-2.227h-9.703V3.035q-1.735.14-3.27.908T6.797 6h4.207q.41 0 .703.293t.293.703v10.008q0 .41-.293.703t-.703.293H6.797q.644.715 1.412 1.271q.768.557 1.623.944q.855.387 1.781.586Q12.54 21 13.5 21M5.812 9.598q.575 0 .915.228q.34.229.34.838q0 .27-.124.44q-.123.17-.31.275q-.188.105-.422.146q-.234.041-.445.041H4.687V9.598Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-presentation.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-presentation.svg new file mode 100644 index 000000000..c5d4879e1 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-presentation.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="#d35230" d="M16.365 0a.597.597 0 0 0-.555.352a.582.582 0 0 0 .128.635l4.985 4.996a.605.605 0 0 0 .635.133a.59.59 0 0 0 .363-.53V.577A.605.605 0 0 0 21.335 0zM2.661 0a.59.59 0 0 0-.582.59v22.82a.59.59 0 0 0 .582.59h18.67a.59.59 0 0 0 .59-.59V8.716a.59.59 0 0 0-.17-.42L13.674.182a.59.59 0 0 0-.42-.181zm.59 1.184h9.754l7.733 7.77v13.863H3.251z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-sound.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-sound.svg new file mode 100644 index 000000000..ead42df06 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-sound.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="#7eb73b"/><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z" fill="white"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-unknown.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-unknown.svg new file mode 100644 index 000000000..a33b32dff --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-unknown.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="black" d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8zM5.83 8H9V4.83zM11 4v5a1 1 0 0 1-1 1H5v10h14V4z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video-ondemand.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video-ondemand.svg new file mode 100644 index 000000000..7ca91146d --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video-ondemand.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-6l-7 4V7z" fill="#eb6a05"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video.svg new file mode 100644 index 000000000..7792b62b9 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12z" fill="#eb6a05"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-word.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-word.svg new file mode 100644 index 000000000..6228ea19b --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-word.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24"><path fill="#026c9c" d="M21.17 3.25q.33 0 .59.25q.24.24.24.58v15.84q0 .34-.24.58q-.26.25-.59.25H7.83q-.33 0-.59-.25q-.24-.24-.24-.58V17H2.83q-.33 0-.59-.24Q2 16.5 2 16.17V7.83q0-.33.24-.59Q2.5 7 2.83 7H7V4.08q0-.34.24-.58q.26-.25.59-.25m-.8 8.09l1.2 3.94H9.6l1.31-6.56H9.53l-.78 3.88l-1.11-3.75H6.5l-1.19 3.77l-.78-3.9H3.09l1.31 6.56h1.37m14.98 4.22V17H8.25v2.5m12.5-3.75v-3.12H12v3.12m8.75-4.37V8.25H12v3.13M20.75 7V4.5H8.25V7Z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-writer.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-writer.svg new file mode 100644 index 000000000..068fd94a1 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-writer.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"><path fill="#026c9c" d="M21.818 0a.795.795 0 0 0-.74.469a.78.78 0 0 0 .172.849l6.646 6.661a.811.811 0 0 0 .849.177a.792.792 0 0 0 .484-.708V.771A.807.807 0 0 0 28.448 0zM3.547 0a.787.787 0 0 0-.776.786v30.427c0 .432.349.781.776.786h24.896a.789.789 0 0 0 .786-.786V11.619a.792.792 0 0 0-.229-.557L18.234.244a.799.799 0 0 0-.563-.245zm.786 1.578h13.005l10.313 10.359v18.484H4.333z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-zip.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-zip.svg new file mode 100644 index 000000000..007419361 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-zip.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 1024 1024"><path fill="#ffd100" d="M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4zM790.2 326L602 137.8V326zM296 136v64h64v-64zm64 64v64h64v-64zm-64 64v64h64v-64zm64 64v64h64v-64zm-64 64v64h64v-64zm64 64v64h64v-64zm-64 64v64h64v-64zm0 64v160h128V584zm48 48h32v64h-32z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/help.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/help.svg new file mode 100644 index 000000000..8c2e93dcc --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/help.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z" fill="#7eb73b"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home.svg new file mode 100644 index 000000000..e8d717eae --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#7eb73b"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/link.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/link.svg new file mode 100644 index 000000000..50ce54c18 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/link.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/logout.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/logout.svg new file mode 100644 index 000000000..7ec1ee20c --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/logout.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z" fill="#7eb73b"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/mark_read.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/mark_read.svg new file mode 100644 index 000000000..e09dd4c43 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/mark_read.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><rect fill="none" height="24" width="24" x="0"/><path d="M12,19c0-3.87,3.13-7,7-7c1.08,0,2.09,0.25,3,0.68V6c0-1.1-0.9-2-2-2H4C2.9,4,2,4.9,2,6v12c0,1.1,0.9,2,2,2h8.08 C12.03,19.67,12,19.34,12,19z M4,6l8,5l8-5v2l-8,5L4,8V6z M17.34,22l-3.54-3.54l1.41-1.41l2.12,2.12l4.24-4.24L23,16.34L17.34,22z"/></g></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/media.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/media.svg new file mode 100644 index 000000000..5d4bac103 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/media.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/remove_circle.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/remove_circle.svg new file mode 100644 index 000000000..2a1ab5f24 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/remove_circle.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11H7v-2h10v2z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/search.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/search.svg new file mode 100644 index 000000000..7c2111eb7 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/search.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/send.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/send.svg new file mode 100644 index 000000000..033ab7a11 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/send.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/settings.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/settings.svg new file mode 100644 index 000000000..155b7d7a1 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/settings.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><path d="M0,0h24v24H0V0z" fill="none"/><path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z" fill="#7eb73b"/></g></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/share.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/share.svg new file mode 100644 index 000000000..07fc6639e --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/share.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/chat_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/chat_shortcut.svg new file mode 100644 index 000000000..b4af4b1bf --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/chat_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 9h12v2H6V9zm8 5H6v-2h8v2zm4-6H6V6h12v2z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/contacts_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/contacts_shortcut.svg new file mode 100644 index 000000000..83277867a --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/contacts_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z" fill="none"/><path d="M20 0H4v2h16V0zM4 24h16v-2H4v2zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25S9.75 10.24 9.75 9 10.76 6.75 12 6.75zM17 17H7v-1.5c0-1.67 3.33-2.5 5-2.5s5 .83 5 2.5V17z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/favorites_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/favorites_shortcut.svg new file mode 100644 index 000000000..d090bc060 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/favorites_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/home_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/home_shortcut.svg new file mode 100644 index 000000000..341070110 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/home_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/tasks_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/tasks_shortcut.svg new file mode 100644 index 000000000..704516259 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/tasks_shortcut.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px"><rect fill="none" height="24" width="24"/><path d="M11,7H2v2h9V7z M11,15H2v2h9V15z M16.34,11l-3.54-3.54l1.41-1.41l2.12,2.12l4.24-4.24L22,5.34L16.34,11z M16.34,19 l-3.54-3.54l1.41-1.41l2.12,2.12l4.24-4.24L22,13.34L16.34,19z"/></svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/speaker_phone.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/speaker_phone.svg new file mode 100644 index 000000000..a8e09c349 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/speaker_phone.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0zm0 0h24v24H0V0z" fill="none"/><path d="M7 7.07L8.43 8.5c.91-.91 2.18-1.48 3.57-1.48s2.66.57 3.57 1.48L17 7.07C15.72 5.79 13.95 5 12 5s-3.72.79-5 2.07zM12 1C8.98 1 6.24 2.23 4.25 4.21l1.41 1.41C7.28 4 9.53 3 12 3s4.72 1 6.34 2.62l1.41-1.41C17.76 2.23 15.02 1 12 1zm2.86 9.01L9.14 10C8.51 10 8 10.51 8 11.14v9.71c0 .63.51 1.14 1.14 1.14h5.71c.63 0 1.14-.51 1.14-1.14v-9.71c.01-.63-.5-1.13-1.13-1.13zM15 20H9v-8h6v8z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/stop.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/stop.svg new file mode 100644 index 000000000..f6976ad79 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/stop.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M6 6h12v12H6z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/view.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/view.svg new file mode 100644 index 000000000..37e45c117 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/view.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2zm0 14H3V5h18v12z"/></svg> \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.png b/mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.png deleted file mode 100644 index 112b1c040..000000000 Binary files a/mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.png and /dev/null differ diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.svg new file mode 100644 index 000000000..4e7617356 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.svg @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="24" + viewBox="0 0 24 24" + width="24" + version="1.1" + id="svg2" + sodipodi:docname="more_verti.svg" + inkscape:version="1.3.1 (9b9bdc1480, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs2" /> + <sodipodi:namedview + id="namedview2" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="31.541667" + inkscape:cx="12.015852" + inkscape:cy="12" + inkscape:window-width="1920" + inkscape:window-height="957" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" /> + <path + d="M0 0h24v24H0z" + fill="none" + id="path1" /> + <path + d="M 15,3 C 15,1.35 13.65,0 12,0 10.349999,0 9,1.35 9,3 c 0,1.65 1.349999,3 3,3 1.65,0 3,-1.35 3,-3 z m 0,17.999999 c 0,-1.65 -1.35,-3 -3,-3 -1.650001,0 -3,1.35 -3,3 0,1.65 1.349999,3 3,3 1.65,0 3,-1.35 3,-3 z m 0,-9 C 15,10.349999 13.65,9 12,9 c -1.650001,0 -3,1.349999 -3,2.999999 0,1.65 1.349999,3 3,3 1.65,0 3,-1.35 3,-3 z" + id="path2" + style="stroke-width:1.49999" /> +</svg> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobil.jsp b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobil.jsp new file mode 100644 index 000000000..3f6e2c4ad --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobil.jsp @@ -0,0 +1,176 @@ +<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %> +<%@ page import="org.silverpeas.core.admin.domain.DomainType" %> +<%@ page import="org.silverpeas.core.admin.domain.DomainTypeRegistry" %> +<%@ page import="org.silverpeas.core.security.session.SessionInfo" %> +<%@ page import="org.silverpeas.core.security.session.SessionManagement" %> +<%@ page import="org.silverpeas.core.security.session.SessionManagementProvider" %> +<%@ page import="org.silverpeas.core.security.token.synchronizer.SynchronizerToken" %> +<%@ page import="org.silverpeas.core.util.LocalizationBundle" %> +<%@ page import="org.silverpeas.core.util.ResourceLocator" %> +<%@ page import="org.silverpeas.core.util.URLUtil" %> +<%@ page import="org.silverpeas.mobile.server.helpers.ResourceBundleHelper" %> +<%@ page import="java.util.Map" %> +<%@ page import="org.silverpeas.core.util.SettingBundle" %> +<%@ page import="org.silverpeas.bridge.MobilFilter" %> + +<%-- + ~ Copyright (C) 2000 - 2022 Silverpeas + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as + ~ published by the Free Software Foundation, either version 3 of the + ~ License, or (at your option) any later version. + ~ + ~ As a special exception to the terms and conditions of version 3.0 of + ~ the GPL, you may redistribute this Program in connection with Free/Libre + ~ Open Source Software ("FLOSS") applications as described in Silverpeas's + ~ FLOSS exception. You should have received a copy of the text describing + ~ the FLOSS exception, and it is also available here: + ~ "http://www.silverpeas.org/docs/core/legal/floss_exception.html" + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU Affero General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + --%> + +<!doctype html> +<html> +<head> + <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> + <meta name="robots" content="noindex"> + <meta name="viewport" + content="width=device-width, target-densitydpi=device-dpi, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/> + + <meta name="mobile-web-app-capable" content="yes"> + <meta name="HandheldFriendly" content="true"> + <meta name="apple-mobile-web-app-capable" content="yes"/> + <meta name="apple-mobile-web-app-status-bar-style" content="default"/> + <link rel="manifest" href="manifest.json"> + + <% + String l = request.getHeader("Accept-Language"); + String appUrl = URLUtil.getApplicationURL(); + if (l != null && !l.isEmpty()) { + + l = l.substring(0, 2); + if (!l.equalsIgnoreCase("fr")) { + l = "en"; + } + } else { + l = "en"; + } + + String loginPage = request.getParameter("forceLoginPage"); + boolean displayLoginPage = false; + if (loginPage != null && loginPage.equalsIgnoreCase("true")) { + displayLoginPage = true; + } + + // SSO case + SynchronizerToken token = + (SynchronizerToken) ((HttpServletRequest) request).getSession().getAttribute("X-STKN"); + LocalizationBundle resourceGeneralLook = + ResourceLocator.getLocalizationBundle("org.silverpeas.lookAndFeel.generalLook", l); + String ssoPath = resourceGeneralLook.getString("login.sso.path"); + if (!displayLoginPage && token == null && (DomainTypeRegistry.get().exists(DomainType.GOOGLE) || + DomainTypeRegistry.get().exists(DomainType.SCIM)) && + (ssoPath != null && !ssoPath.isEmpty())) { + if (!ssoPath.startsWith("/")) { + ssoPath = "/" + ssoPath; + } + ssoPath = appUrl + ssoPath; + response.sendRedirect(ssoPath); + } else { + session.removeAttribute(MobilFilter.SESSION_PARAMS_KEY); + } + + if (token != null) { + out.print("<meta name='sp_token' content='" + token.getValue() + "'/>"); + + SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement(); + SessionInfo sessionInfo = sessionManagement.validateSession(session.getId()); + out.print("<meta name='sp_session' content='" + sessionInfo.getSessionId() + "'/>"); + + } + + LocalizationBundle resourceLabels = + ResourceLocator.getLocalizationBundle("org.silverpeas.mobile.multilang.mobileBundle", l); + Map<String, String> map = ResourceBundleHelper.convertResourceBundleToMap(resourceLabels); + String jsonLabels = new ObjectMapper().writeValueAsString(map); + + LocalizationBundle resource = + ResourceLocator.getLocalizationBundle("org.silverpeas.mobile.mobileSettings", l); + Map<String, String> mapConfig = ResourceBundleHelper.convertResourceBundleToMap(resource); + String jsonParams = new ObjectMapper().writeValueAsString(mapConfig); + + String nocache = resource.getString("nocache"); + if (nocache.equalsIgnoreCase("true")) { + response.setHeader("Clear-Site-Data", "\"cache\", \"storage\""); + } + %> + + <meta name="gwt:property" content="locale=<%=l%>"> + + <link rel="apple-touch-icon" href="<%= resource.getString("apple-touch-icon")%>"/> + <link rel="apple-touch-icon" sizes="72x72" + href="<%= resource.getString("apple-touch-icon72x72")%>"/> + <link rel="apple-touch-icon" sizes="114x114" + href="<%= resource.getString("apple-touch-icon114x114")%>"/> + <link rel="shortcut icon" sizes="196x196" + href="<%= resource.getString("shortcut_icon196x196")%>"/> + <link rel="shortcut icon" sizes="128x128" + href="<%= resource.getString("shortcut_icon128x128")%>"/> + + <title><%= resourceLabels.getString("shortcut_title")%> + </title> + <% + SettingBundle settings = ResourceLocator.getSettingBundle("org.silverpeas.mobile.mobileSettings"); + String jsonFireBaseConfig = settings.getString("push.notification.clientConfig", "null"); + if (!jsonFireBaseConfig.equals("null")) { + out.println("<script src='"+ appUrl + "/spmobile/firebasejs/7.12.0/firebase-app.js'></script>"); + out.println("<script src='" + appUrl + "/spmobile/firebasejs/7.12.0/firebase-messaging.js'></script>"); + } + %> + + <script type="text/javascript" src="<%=appUrl%>/spmobile/spmobile.nocache.js"></script> + <script> + var labels = <% out.println(jsonLabels); %>; + var params = <% out.println(jsonParams); %>; + + function resize() { + var windowHeight = window.innerHeight; + document.body.style.height = windowHeight + "px"; + } + function navigate(url) { + window.navigateTo(url); + } + </script> + + <% + String css = resource.getString("styleSheet"); + if (css != null && !css.isEmpty()) { + out.println("<link rel='stylesheet' type='text/css' href='" + css + "'>"); + } + %> + + +</head> +<body class="ui-panel-wrapper ui-page-theme-a csspinner traditional" onload="resize();"> +<% + String fullSsoPath = ""; + if (!ssoPath.trim().isEmpty()) { + fullSsoPath = request.getRequestURL().toString(); + fullSsoPath = fullSsoPath.replace("/spmobile/spmobil.jsp", ""); + fullSsoPath = fullSsoPath + ssoPath; + } +%> +<input type="hidden" id="ssoPath" value="<%=fullSsoPath%>"> +<div id="oneinch" + style="position: absolute;padding: 0;visibility: hidden;width: 1in;height: 1in;"></div> + +</body> + +</html> diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css index cd3d0d5df..917e75da6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css +++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css @@ -22,12 +22,16 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +@import "components.css"; +@import "animations.css"; + /* Globals */ /* Font -----------------------------------------------------------------------------------------------------------*/ html { font-size: 100%; height: 100%; + scrollbar-width: none; } body.ui-panel-wrapper { @@ -36,10 +40,15 @@ body.ui-panel-wrapper { background-color: #ececec; } -body, input, select, textarea, button, .ui-btn { +body { font-size: 10pt; line-height: 1em; - font-family: Open Sans, sans-serif + font-family: Open Sans, sans-serif; + overscroll-behavior-y: contain; +} + +input, select, textarea, button, .ui-btn { + font-size: 1em; } legend, .ui-input-text input, .ui-input-search input { @@ -49,7 +58,7 @@ legend, .ui-input-text input, .ui-input-search input { /* Form labels (overrides font-weight bold in bars, and mini font-size) */ .ui-mobile label, div.ui-controlgroup-label { font-weight: normal; - font-size: 16px; + font-size: 1.2em; } /* Separators @@ -160,7 +169,7 @@ legend, .ui-input-text input, .ui-input-search input { /* Icons -----------------------------------------------------------------------------------------------------------*/ .ui-btn-icon-left:after, .ui-btn-icon-right:after, .ui-btn-icon-top:after, .ui-btn-icon-bottom:after, .ui-btn-icon-notext:after { - background: transparent url(packImagesNavigation.png) right -963px; + background: transparent url('icons/arrow_forward.svg') right; content: " "; } @@ -253,11 +262,8 @@ legend, .ui-input-text input, .ui-input-search input { .ui-page-theme-a .ui-body-inherit.filter-contacts { background-color: #FFF; - background-image: url(packPictos.png); - background-position: 5px -577px; + background-image: url('icons/search.svg'); background-repeat: no-repeat; - width: 92%; - padding-left: 2em; } .ui-page-theme-a textarea.ui-body-inherit { @@ -376,18 +382,6 @@ html .ui-controlgroup-controls .ui-btn-up-c { .last-event-bloc h3.title-bloc-part{ position:relative; } -.last-event-bloc h3.title-bloc-part::after{ - content:''; - display:block; - width:16px; - height:16px; - background-image: url(packImagesNavigation.png); - background-position:-28px -2174px; - background-repeat: no-repeat; - position:absolute; - top:0; - right:1.25em; -} .last-event-bloc .ui-listview .date { float:right; @@ -425,9 +419,13 @@ html .ui-controlgroup-controls .ui-btn-up-c { font-weight: normal; } +#header { + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); +} + #header, #navigation-footer { - background-color: #333; + background-color: black; height: 46px; border-bottom: 2px solid #151515; position: fixed; @@ -443,84 +441,59 @@ html .ui-controlgroup-controls .ui-btn-up-c { } #navigation-footer a { - bottom: 0; - top: auto; + margin: 12px; + text-align: center; flex: 1; - text-indent: -300em; - border-left: 1px solid #151515; - border-right: 1px solid #444444; + transform: scale(1.5); + fill: #7eb73b; } #navigation-footer .btn-list-navigation { - background: transparent url(packImagesNavigation.png) center -640px no-repeat; + } #navigation-footer .btn-find-contact { - background: transparent url(packImagesNavigation.png) center -709px no-repeat; + transform: scale(1.2); } #navigation-footer .btn-update-tchat { - background: transparent url(packImagesNavigation.png) center -771px no-repeat; + transform: scale(1.2); } #navigation-footer .btn-list-task { - background: transparent url(packImagesNavigation.png) center -835px no-repeat; + } #navigation-footer .btn-list-favoris { - background: transparent url(packImagesNavigation.png) center -892px no-repeat; + transform: scale(1.4); } #header h1 { color: #fff; - font-size: 0.8em; + font-size: 1.1em; font-weight: normal; - left: 60px; + left: 50px; line-height: 44px; margin: 0; overflow: hidden; padding: 0; position: absolute; - right: 94px; top: 1px; height: 44px; - text-shadow: 0 1px 0 #000; -} - -.ui-icon-bars:after { - width: 18px; - height: 18px; - content: ""; - display: block; - position: absolute; - top: 14px; - left: 14px; - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E"); - background-position: center center; - background-repeat: no-repeat; - background-size: 100%; - z-index: -1; -} - -.ui-icon-bars { - border-right: 2px solid #151515; - width: 44px; - height: 44px; - padding: 0; - text-indent: -9999px; - display: block; - position: relative; + width: calc(100vw - 50px - 2.5em); + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; } .ui-btn-right.back { - background: #4c4c4c url(bg-degrade.png) bottom center repeat-x; - color: #FFF; - text-shadow: 0 1px 0 #000; - border: 1px solid #000; - height: 28px; - line-height: 28px; - padding: 0 1em; - font-size: 0.8em; + background: url('icons/arrow_back.svg') no-repeat; + border: none; + height: 36px; + width: 36px; + margin: 0 0 0 0; + padding: 0 0 0 0; + left:0; } /* HOME */ @@ -530,6 +503,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { .ui-page-content { padding: 0; + min-height: calc(100vh - 92px); } #menu-principal { @@ -569,10 +543,13 @@ html .ui-controlgroup-controls .ui-btn-up-c { font-size: 0.8em; } +.favoris-bloc span { + fill : #a9a9a9; + white-space: normal; +} + .favoris-bloc a { padding-left: 2.5em; - font-size: 0.95em; - background: transparent url(packImagesNavigation.png) 0.5em -1186px no-repeat; } .racourcis-bloc a { @@ -599,8 +576,8 @@ html .ui-controlgroup-controls .ui-btn-up-c { } .last-publication-bloc .ui-listview li .ui-btn { - text-overflow: initial; - overflow: auto; + text-overflow: ellipsis; + overflow: hidden; white-space: inherit; } @@ -620,6 +597,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { .carroussel-news li { height: 90px; position: relative; + overflow: hidden; } .carroussel-news img { @@ -648,7 +626,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { .carroussel-news p { font-size: 0.75em; - line-height: 1em; + line-height: inherit; color: #666666; padding: 0; margin: 0; @@ -656,7 +634,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { .carroussel-news .nbIndication { position: absolute; - bottom: -0.7em; + bottom: 0em; right: 0.5em; font-size: 0.85em; } @@ -665,6 +643,15 @@ html .ui-controlgroup-controls .ui-btn-up-c { color: #1c94d4 } +#shortCuts ul li { + display: flex; + align-items: center; +} + +#shortCuts ul li a { + width: 100%; +} + /***** MENU****/ #silverpeas-navmenu-panel { padding: 0; @@ -672,6 +659,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { background-color: #f4f4f4; position: fixed; font-size: 0.8em; + height: 100vh; } #silverpeas-navmenu-panel .ui-panel-inner { @@ -685,10 +673,10 @@ html .ui-controlgroup-controls .ui-btn-up-c { #silverpeas-navmenu-panel #user img { float: left; - width: 30px; + width: 2.5em; vertical-align: middle; margin-right: 0.25em; - border-radius: 30px; + border-radius: 100%; margin-right: 0.5em; border: 1px solid #9d9c9c; } @@ -701,72 +689,115 @@ html .ui-controlgroup-controls .ui-btn-up-c { #silverpeas-navmenu-panel #user .edit-my-statut { display: inline-block; text-indent: -3000px; - background: transparent url(packPictos.png) 4px 0 no-repeat; - width: 20px; + background: transparent url('icons/edit.svg') no-repeat; + width: 18px; + height: 18px; } #silverpeas-navmenu-panel #navmenu-panel { border-top: 1px solid #d3d3d3; - border-bottom: 1px solid #d3d3d3; - list-style-type: none; - padding: 0; margin: 0; + padding: 0; } #silverpeas-navmenu-panel #navmenu-panel li { - padding: 0; - margin: 0; + list-style-type: none; + display: flex; + align-items: center; +} + +#silverpeas-navmenu-panel #navmenu-panel li span { + position: relative; + display: inline; + margin-left: 0.5em; + font-size: 1.25em; +} + +#silverpeas-navmenu-panel #navmenu-panel li span svg { + height: 1.5em; + width: 1.5em; } #silverpeas-navmenu-panel #navmenu-panel li a { - text-decoration: none; + position: relative; + display: inline; + border: none; + font-size: 1.25em; + padding-left: 0.5em; color: #333333; - display: block; - padding: 0.5em 0 0.5em 32px; - font-size: 0.9em; - line-height: 1.6em; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-config a { - background: transparent url(packPictos.png) 8px -520px no-repeat; +#actions-menu > :first-child, #navmenu-panel > :first-child, #personals-apps > :first-child { + padding-top: 1em; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-tasks a { - background: transparent url(packPictos.png) 8px -394px no-repeat; +#actions-menu > :last-child, #navmenu-panel > :last-child, #personals-apps > :last-child { + padding-bottom: 1em; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-help a { - background: transparent url(packPictos.png) 8px -134px no-repeat; +#personals-apps { + border-top: 1px solid #d3d3d3; + margin: 0; + padding: 0; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-notificationsbox a { - background: transparent url(packPictos.png) 8px -515px no-repeat; +#personals-apps li { + list-style-type: none; + display: flex; + align-items: center; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-sharesbox a { - background: transparent url(packPictos.png) 8px -539px no-repeat; +#personals-apps li span { + position: relative; + display: inline; + margin-left: 0.5em; + font-size: 1.25em; +} +#personals-apps li span svg { + height: 1.5em; + width: 1.5em; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-parameter a { - background: transparent url(packPictos.png) 8px -98px no-repeat; +#personals-apps li a { + position: relative; + display: inline; + border: none; + font-size: 1.25em; + padding : 0 0 0 0.5em; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-home a { - background: transparent url(packPictos.png) 8px -25px no-repeat; +#actions-menu { + border-top: 1px solid #d3d3d3 !important; + position: absolute; + bottom: 48px; + width: 100%; + border: 0; + padding-left: 0.5em; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-logout a { - background: transparent url(packPictos.png) 8px -63px no-repeat; +#actions-menu li { + list-style-type: none; + display: flex; + align-items: center; + fill: #7eb73b; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-tchat a { - background: transparent url(packPictos.png) 8px -276px no-repeat; +#actions-menu li span svg { + height: 1.5em; + width: 1.5em; } -#silverpeas-navmenu-panel #navmenu-panel li#menu-usercalendar a { - background: transparent url(packImagesNavigation.png) -20px -2171px no-repeat; +#actions-menu li a { + text-decoration: none; + color: #333333; + display: block; + padding-bottom: 0.5em; + padding-top: 0.5em; + font-size: 1.25em; + margin-left: 0.5em; } + #menu-principal li a strong { color: #333333; } @@ -791,31 +822,48 @@ html .ui-controlgroup-controls .ui-btn-up-c { /***** NAVIGATION ****/ -.folder-ged a, .folder-galery a, .publication a, .media a, .trash a, .add-media a, .app-actuality a, +#spaces ul li, #favoris ul li, #edm li { + display: flex; + align-items: center; +} + +#spaces ul li a, #favoris ul li a, #edm li a { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} + +.icon-app, .icon-item { + position: absolute; + left: 0.5em; + z-index: 2; +} + +.folder-ged a, .folder-galery a, .publication a, .media a, .trash a, .app-actuality a, .app-ged a, .app-medialib a, .publication.ui-input-text, .app-blog a, .app-pageWeb a, .app-workflow a, .app-link a, .app-almanach a, .app-formsOnline a, .app-classifieds a, .app-survey a, .app-faq a, .app-polling a, .app-resourcesManager a { - background-image: url(packImagesNavigation.png); - background-position: 0.5625em 0.5625em; - background-repeat: no-repeat; - padding-left: 2.056em + padding-left: 2.5em; } -.add-media, -.add-task { - background-color: #FDF4EF; - border-bottom: 1px solid #EDBCBB; - border-top: 1px solid #EDBCBB; +#actionList-bloc > li { + display: inline-block; + padding-left: 0.5em; } -.ui-listview > li.add-media a, -.ui-listview > li.add-task a { - background: #FDF4EF none; - padding-left: 1em +#actionList-bloc > li:last-child { + padding-left: 0em; } -.ui-listview > li.add-media a::after, -.ui-listview > li.add-task a::after { - background-position: right -599px; - width: 3em; +.add-task { + height: 24px; + width: 24px; + filter: invert(1); + background: url('icons/add.svg') no-repeat; +} + +.add-task a { + height: 24px; + width: 24px; + display: block; } .publication.ui-input-text { @@ -823,71 +871,90 @@ html .ui-controlgroup-controls .ui-btn-up-c { } .app-formsOnline a { - background-position: 0.65em -2208px; + } .app-almanach a { - background-position: -20px -2167px; + } .app-link a { - background-position: 0.65em -1684px; + } .app-actuality a { - background-position: 0.5em -1026px; + } .folder-ged a { - background-position: 0.5em 0.5em; + +} + +.app-ged a { + } .app-pageWeb a { - background-position: 0.7em -1395px; + } .app-blog a { - background-position: 0.65em -1509px; + } .app-classifieds a { - background-position: 0.65em -2240px; + } .app-survey a { - background-position: 0.65em -2270px; + } .app-polling a { - background-position: 0.65em -2330px; + } .app-faq a { - background-position: 0.65em -2300px; + } .app-workflow a { - background-position: 0.65em -1595px; + } .app-resourcesManager a { - background-position: 0.65em -2360px; + } .folder-galery a { - background-position: 0.5em -95px; + } .publication a { - background-position: 0.5em -190px; + } .trash a { - background-position: 0.5em -495px; + } .media a { - background-position: 0.5em -287px; + background: transparent url('icons/media.svg') no-repeat; + background-position-y: center; + background-position-x: 0.5em; +} + +.add-media, .add-file { + height: 24px; + width: 24px; + filter: invert(1); + background: url('icons/add.svg') no-repeat; +} + +.add-media a, .add-file a { + height: 24px; + width: 24px; + display: block; } .media-thumb:first-child { @@ -895,33 +962,39 @@ html .ui-controlgroup-controls .ui-btn-up-c { } .ui-listview .media-thumb { - width: 70px; - border: 1px solid #ccc; + width: 20vw; float: left; - margin: 8px 0 0 8px; + margin-left: 4vw; + margin-top: 4vw; } .media-thumb .ui-thumb { - width: 64px; - height: 94px; overflow: hidden; display: block; border: 3px solid #FFF; + background-color: white !important; + box-shadow: 0 2px 10px 0 rgba(0,0,0,0.3); } .media-thumb .ui-thumb img { - min-width: 64px; - max-height: 75px; - max-width: 75px; - min-height: 64px; - height: auto; + width: 100%; + height: 75px; + object-fit: scale-down; } .media-thumb .ui-thumb span { - font-size: 0.6em; - height: 2.4em; + font-size: 0.8em; + height: 2em; display: inline-block; overflow: hidden; + line-height: 1em; + background-color: #f6f6f6; + width: 100%; + color: black; +} + +audio::-webkit-media-controls-enclosure { + border-radius: 0;; } .info-nb-sous-elmt { @@ -961,7 +1034,6 @@ html .ui-controlgroup-controls .ui-btn-up-c { color: #848484; padding: 1em; margin: 0; - font-size: 10pt; } .lastUpdate { @@ -969,7 +1041,6 @@ html .ui-controlgroup-controls .ui-btn-up-c { padding-top: 1em; padding-left: 1em; margin: 0; - font-size: 10pt; } .nbViews { @@ -977,7 +1048,6 @@ html .ui-controlgroup-controls .ui-btn-up-c { padding-top: 1em; padding-left: 1em; margin: 0; - font-size: 10pt; font-style: italic; } @@ -997,7 +1067,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { .appHeader { padding: 0 1em; margin: 0; - font-size: 12pt; + font-size: 1.2em; font-weight: normal; height: 3em; line-height: 3em; @@ -1005,7 +1075,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { .comments .publiName, .comments .mediaName { margin-right: 1em; - background: transparent url(packImagesNavigation.png) right -400px no-repeat; + background: transparent url('icons/comment.svg') no-repeat right; } .cadrePhoto { @@ -1049,6 +1119,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { .list-reservations li > *, .list-detail-event > * { padding:1em; + padding-left: 0.5em; } #linkedPublications li { @@ -1080,8 +1151,10 @@ html .ui-controlgroup-controls .ui-btn-up-c { border: 0 none; margin: 0; text-align: left; - background: #fff url(packImagesNavigation.png) 0.5625em -390px no-repeat; - padding-left: 2.5625em; + background: url('icons/comment.svg') no-repeat; + padding-left: 3em; + background-position-y: center; + background-position-x: 0.5em; } #info-event, .elts-pub { @@ -1121,12 +1194,14 @@ html .ui-controlgroup-controls .ui-btn-up-c { line-height: 1.25em; } +.icon-participation { + position: absolute; +} + #event #participation .label { - background: #fff url(packImagesNavigation.png) 0.15em -1870px no-repeat; - padding-left: 1.5625em; - line-height: 1.15em; + line-height: 2em; padding-bottom: 0.5em; - display: block; + padding-left: 2em; } #event #participation ul { @@ -1162,15 +1237,16 @@ html .ui-controlgroup-controls .ui-btn-up-c { #event .actions-rappel { display: inline-block; + vertical-align: middle; } #event .actions-rappel .delete { text-indent: -300em; display: inline-block; - width: 20px; - height: 20px; + width: 24px; + height: 24px; padding: 0 !important; - background: transparent url(packImagesNavigation.png) 0em -2054px no-repeat; + background: transparent url('icons/remove_circle.svg') no-repeat; } #comments .link-add-comment { @@ -1178,15 +1254,19 @@ html .ui-controlgroup-controls .ui-btn-up-c { text-decoration: underline; } +#add-comment { + margin-left: 1em; + margin-right: 1em; +} + #add-comment, .introduction { - padding: 0 1em; position: relative; margin-bottom: 1em } #add-comment h3 { - font-size: 10pt; + font-size: 1em; font-weight: normal; margin: 0; padding: 0; @@ -1199,76 +1279,156 @@ html .ui-controlgroup-controls .ui-btn-up-c { } #add-comment textarea.ui-input-text { - font-size: 9pt; + font-size: 0.9em; + height: 7em; + border-radius: 10px; } #add-comment .btn-publicate { - font-size: 10pt; + font-size: 1em; color: #ec9c01; display: block; text-align: right; + background: url("icons/send.svg") no-repeat right; + height: 24px; + width: 24px; + position: absolute; + right: 0; + bottom: 5px; + margin-right: 0.5em ; } #add-comment .btn-publicate.inactif { color: #999; text-decoration: none; + filter: opacity(0.5); } #attachments li a { text-decoration: none; color: #000; + display: flex; +} + +#attachments li a .weight { + display: block; + color: #848484; } -#attachments li a .weight, #a-media #attachments li a .dimension { display: block; - padding-left: 24px; color: #848484; + padding-left: 0px; } #a-media #attachments li a .weight { display: inline-block; - padding-left: 4px; + padding-left: 0px; } #attachments li a img { vertical-align: bottom; border: 0; margin-right: 8px; + float: left; + height: 24px; + width: 24px; +} + +#attachments li a.expand-more { + background: transparent url(icons/expand_more.svg) right 0.5em no-repeat; + margin-right: 0.5em; } -#attachments li a.downloadable { - background: transparent url(download.png) right 1em no-repeat; - display: block; - margin-right: 1.5em; +#attachments li a.expand-less { + background: transparent url(icons/expand_less.svg) right 0.5em no-repeat; + margin-right: 0.5em; } #shares li { width: max-content; } -#shares li a.share-link { - background: transparent url(download.png) right 1em no-repeat; - display: inline-block; - width: 10px; - height: 24px; + +#attachments li a span { + display: block; + padding-right:1em; +} + +.ops-open, .ops-open #share, .ops-open #download, .ops-open #view, .ops-open #notify { + transition: all .25s ease-in-out; + color: transparent; + height: 30px; + line-height:30px; + transform: scaleY(1); + margin-bottom:1em; +} + +.ops-closed, .ops-closed #share, .ops-closed #download, .ops-closed #view, .ops-closed #notify { + transition: all .25s ease-in-out; + height: 0px; + line-height:0px; + transform: scaleY(1); + margin-bottom:0px; +} + +.item-open { + transition: all .25s ease-in-out; + color: transparent; + max-height: 600px; +} + +.item-closed { + transition: all .25s ease-in-out; + max-height: 0px; +} + + +li > #operations { + padding:0em; +} + +#download { + background : transparent url(icons/download.svg) no-repeat; + background-position: 50% 50%; + background-color:#ececec; + width: 30px; + height: 30px; + border-radius: 0.25em; margin-right: 1em; - margin-left: 1em; + float : right; } -#attachments li a.share { - background: transparent url(share.png) right 1em no-repeat; - display: block; - margin-right: 1.5em; - margin-bottom: 1em; +#view { + background: transparent url(icons/view.svg) no-repeat; + background-position: 50% 50%; + background-color:#ececec; + width: 30px; + height: 30px; + border-radius: 0.25em; + margin-right: 1em; + float : right; } -#attachments li a span { - display: inline-block; +#share { + background: transparent url(icons/share.svg) no-repeat; + background-position: 50% 50%; + background-color:#ececec; + width: 30px; + height: 30px; + border-radius: 0.25em; + margin-right: 1em; + float : right; } -#attachments li a.not-downloadable { - background: transparent url(forbidden-download.png) right 10px no-repeat; - display: block; +#notify { + background: transparent url(icons/send.svg) no-repeat; + background-position: 50% 50%; + background-color:#ececec; + width: 30px; + height: 30px; + border-radius: 0.25em; + margin-right: 1em; + float : right; } /********** CONTACT *******/ @@ -1281,20 +1441,18 @@ html .ui-controlgroup-controls .ui-btn-up-c { font-style: italic; } -#btn-my-contacts > span, #btn-all-contacts > span { - background: transparent url(packPictos.png) 4px -241px no-repeat; +#btn-my-contacts > span, #btn-all-contactsext > span { + background: url('icons/contacts.svg') no-repeat; padding-left: 30px; display: block; - line-height: 0.8em; text-align: left; font-size: 0.8em; } -#btn-all-contactsext > span { - background: transparent url(packPictos.png) 4px -170px no-repeat; +#btn-all-contacts > span { + background: url('icons/account.svg') no-repeat; padding-left: 30px; display: block; - line-height: 0.8em; text-align: left; font-size: 0.8em; } @@ -1303,6 +1461,7 @@ html .ui-controlgroup-controls .ui-btn-up-c { margin-bottom: 2em; } + /* notification */ #notification .list-contacts li { @@ -1325,18 +1484,20 @@ html .ui-controlgroup-controls .ui-btn-up-c { } #edit-notification .ui-input-text.destinataires { - background: #FFF url(packPictos.png) 13px -234px no-repeat; - padding-left: 4em; line-height: 1.4em; position: relative; - color: #AAA; - font-size: 80%; + color: #000; + font-size: 0.8em; min-height: 3.4em; } +#edit-notification #message { + height: 15em; +} + #edit-notification .ui-input-text.destinataires .nb-user-sectionne { position: absolute; - top: 1em; + top: 0.5em; left: 1.6em; font-size: 1.4em; color: #333; @@ -1347,24 +1508,24 @@ html .ui-controlgroup-controls .ui-btn-up-c { top: 0.1em; right: 0.1em; bottom: 0.1em; - background: #7eb73a url(packPictos.png) 0.5em 0.5em no-repeat; display: block; text-indent: -300em; width: 2em; } -#notification .list-notifications > li.selected, .list-resources > li.selected { +#notification .list-notifications > li.selected, .list-resources > li.selected, #tasks > li.selected, +.notifications > li.selected, .shares > li.selected, .favoris > li.selected { border-left: 8px solid #7eb73a; color: #000 } #notification .list-notifications { - font-size: 80%; + font-size: 0.8em; } #notification .title-instruction { display: inline-block; - font-size: 80%; + font-size: 0.8em; font-style: italic; } @@ -1372,14 +1533,18 @@ html .ui-controlgroup-controls .ui-btn-up-c { margin-bottom: 0; } +#edit-notification .iconFile { + position: absolute; +} + .filter-contacts, #edit-notification .ui-input-text.publication { width: 98%; padding-right: 1%; padding-left: 1%; - line-height: 2em; + line-height: 2.5em; background-color: #FFF; - font-size: 80%; + font-size: 0.8em; } .ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn, .ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn, .ui-controlgroup-horizontal .ui-controlgroup-controls .ui-checkbox, .ui-controlgroup-horizontal .ui-controlgroup-controls .ui-radio, .ui-controlgroup-horizontal .ui-controlgroup-controls .ui-select { @@ -1405,17 +1570,21 @@ input.filter-contacts { .list-contacts, .list-comments, .list-notifications, { - font-size: 10pt; + font-size: 1em; line-height: 1.8em; } .list-contacts .user-name img, .list-comments .user-name img, .list-notifications .user-name img { - width: 24px; + width: 32px; border: 1px solid #ccc; float: right; - margin-right: 1em; +} + +.icon-group svg { + float: right; + width: 32px; } .list-contacts .user-name, @@ -1436,6 +1605,19 @@ input.filter-contacts { color: #ec8001; text-decoration: none; white-space: nowrap; + margin-right: 1em; +} + +.tel-link span { + margin-left: 1em; +} + +.tel-link svg { + fill:#ec8001; +} + +.sms-link svg { + fill:#ec8001; } /***** STATUT & ADD COMMENT***/ @@ -1445,7 +1627,7 @@ input.filter-contacts { } #update-statut h2, #send-message h2 { - font-size: 13pt; + font-size: 1.3em; font-weight: normal } @@ -1472,6 +1654,12 @@ input.filter-contacts { border-radius: 10px; } +.btn-validate { + text-transform: uppercase; + border-radius: 2px; + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); +} + .ui-page-theme-a .btn-validate { background-color: #6fa800; background: linear-gradient(#7eb73a, #6fa800) repeat scroll 0 0 #6fa800; @@ -1480,6 +1668,7 @@ input.filter-contacts { color: #fff !important; text-decoration: none; display: block; + font-weight: bold; } .btn-validate.smaller { @@ -1502,7 +1691,7 @@ input.filter-contacts { .ui-btn-left, .ui-btn-right { position: absolute; - top: .24em; + top: 5px; } .ui-btn { @@ -1536,6 +1725,7 @@ textarea.ui-input-text { .ui-controlgroup-horizontal .ui-controlgroup-controls { display: inline-block; vertical-align: middle; + margin-top:0.5em; } .ui-controlgroup-controls, .ui-controlgroup-controls .ui-radio, .ui-controlgroup-controls .ui-checkbox, .ui-controlgroup-controls .ui-select, .ui-controlgroup-controls li { @@ -1569,32 +1759,55 @@ textarea.ui-input-text { #formLogin { text-align: center; - padding-top: 1em; + padding-top: 4em; } #page-login #Login, #page-login #Password { + box-sizing: border-box; background: #FFF url(bg-input-login.png) 0 0 no-repeat; - padding-left: 24px; + padding-left: 2em; border: 1px solid #dddddd; - width: 210px; - margin: 0 0 1em 0; + width: 70vw; + margin: 0 0 1.5em 0; + line-height: 2em; + border-radius: 0.25em; + box-shadow: 0 0 1em 0 rgba(0, 0, 0, 0.2); } #page-login #Password { background: #FFF url(bg-input-password.png) 0 0 no-repeat; } -#page-login #DomainId { - width: 237px; +#page-login #DomainId, .filter-list { + width: 70vw; + box-sizing: border-box; + padding: 0.5em; + background-color: white; + border-radius: 0.25em; + border: none; + box-shadow: 0 0 1em 0 rgba(0, 0, 0, 0.2); +} + +.field-label { + padding-right: 1em; } #page-login #password-visibility { - margin-bottom: 1em; + margin-bottom: 1.5em; } #page-login #copyright { + bottom: 3em; + font-size: 0.8em; + left: 0; + position: fixed; + right: 0; + text-align: center; +} + +#page-login #version { bottom: 1em; - font-size: 80%; + font-size: 0.8em; left: 0; position: fixed; right: 0; @@ -1604,7 +1817,7 @@ textarea.ui-input-text { #page-login .btn-validate, #page-login .btn-validate:visited { padding: 0.5em 0; - width: 235px; + width: 10em; margin: 1em 0 0 } @@ -1635,19 +1848,19 @@ textarea.ui-input-text { .searchBox { border: 1px solid #d3d3d3; border-radius: 3px; - width:calc( 100% - 2em - 20px ); + width:calc( 100% - 4em ); background-color: #FFF; color: #666; padding: 5px; outline-style: none; + height: 1.5em; } -.searchButton { - width: 20px; - height: 17px; - background: transparent url(packPictos.png) bottom left no-repeat; - text-indent: -300em; +.searchButton svg { + width: 2em; + height: 2em; display: inline-block; + position: absolute; } #menu-search { @@ -1656,14 +1869,6 @@ textarea.ui-input-text { border-top: 1px solid #d3d3d3; } -#menu-config { - /*display:none;*/ -} - -#menu-tasks { - /*display:none;*/ -} - .bloc-actu-vignette, .bloc-actu-content { float: left; } @@ -1681,11 +1886,11 @@ textarea.ui-input-text { padding: 0; } -.ui-content .carroussel-news li { +.carroussel-news li { height: auto !important; clear: both; border-bottom: 1px solid #eee; - margin-bottom: 1em + margin-bottom: 1em; } .ui-content .carroussel-news .caption { @@ -1718,7 +1923,7 @@ textarea.ui-input-text { } .liste-news li p, .liste-annonces li p { - font-size: 11px; + font-size: 0.82em; color: #666; } @@ -1733,7 +1938,6 @@ textarea.ui-input-text { border: 0 none; margin: 0; text-align: left; - /*background:#fff url(packImagesNavigation.png) 0.5625em -386px no-repeat;*/ padding-left: 2.5625em; } @@ -1744,7 +1948,7 @@ textarea.ui-input-text { .forms .form-title { color: #333333; - font-size: 130%; + font-size: 1.3em; font-weight: bold; margin: 0 0 5px; padding: 0; @@ -1843,30 +2047,6 @@ form .forms .fields > li:nth-child(even) { float: left; } -.ui-listview input[type="range"] { - -webkit-appearance: none; - -moz-apperance: none; - border-radius: 0px; - border: 0; - height: 4px; - margin: 1em 0; - background-image: -webkit-gradient( - linear, - left top, - right top, - color-stop(0, #72ab0e), - color-stop(0, #C5C5C5) - ); -} - -.ui-listview input[type='range']::-webkit-slider-thumb { - -webkit-appearance: none !important; - background-color: transparent; - border: 0; - height: 1px; - width: 1px; -} - .task-percent-range { width: 80%; float: right; @@ -1902,25 +2082,33 @@ form .forms .fields > li:nth-child(even) { padding: 1em; } +#actions { + position: absolute; + right: 8px; + top: 11px; + filter: invert(1); + z-index: 9999; +} + #action-button { border: 0; position: absolute; width: 16px; height: 24px; text-indent: -3000px; - top: 1em; - right: 1em; - background: transparent url("qvf.png") 0 0 no-repeat; + right: 8px; + background: transparent url("qvf.svg") 0 0 no-repeat; outline: none; z-index: 999; + padding-left: 12px; + padding-right: 12px; } #action-bloc { - display: none; border: 0; position: absolute; - top: 3em; - right: 1em; + top: 37px; + right: 2px; padding: 0; margin: 0; width: 10em; @@ -1942,33 +2130,132 @@ form .forms .fields > li:nth-child(even) { width: 100%; } +#actionsList { + position: absolute; + top: 11px; + right: 50px; + z-index: 9999; +} + +#actionsList ul { + margin: 0; + padding: 0; +} + +#actionsList li { + list-style: none; +} + +#actionsList.menu-empty { + right: 8px; +} + +.empty { + display: none; +} + +.delete-action { + height: 24px; + width: 24px; + filter: invert(1); + background: url('icons/delete.svg') no-repeat; +} + +.add-action { + height: 24px; + width: 24px; + filter: invert(1); + background: url('icons/add.svg') no-repeat; +} + +.speak-action { + height: 24px; + width: 24px; + filter: invert(1); + background: url('icons/speaker_phone.svg') no-repeat; +} + +.speak-action.running { + background: url('icons/stop.svg') no-repeat; + animation: stopSpeak 2s infinite; +} + +@-webkit-keyframes stopSpeak { + 50% { + transform: scale(1.5); + opacity: 50 + } + 100% { + transform: scale(1.5); + opacity: 50 + } +} + .config .actuality a { - background-image: url(packImagesNavigation.png); - background-position: right -1022px; - background-repeat: no-repeat; + } .config .publication a { - background-position: right -184px; + background:none; } .config .event a { - background-image: url(packImagesNavigation.png); - background-position: right -1393px; - background-repeat: no-repeat; + } .config .favoris a { - background: transparent url(packImagesNavigation.png) right -1182px no-repeat; + } .config li a { padding-left: 1em; } +.font-percent-size { + margin-left: 1em; + margin-bottom: 3em; + width: calc(100% - 2em); +} + +.filters > span { + display: block; + margin-left: 1em; +} + +.ui-listview.favoris { + overflow: hidden; +} + .ui-listview.favoris a { - background: transparent url(packImagesNavigation.png) 0.5em -1182px no-repeat; - padding-left: 2em; + padding-left: 2.5em; +} + +.ui-listview.favoris span { + top: 0.25em; + fill : #a9a9a9; +} + +.ui-listview.favoris .category { + z-index: 3; +} + +.ui-listview.favoris .category .category-title { + font-weight: bold; +} + +.ui-listview.favoris .category .category-desc { + display: block; +} + +.ui-listview.favoris .category .category-icon { + position: absolute; + right: 0.5em; + fill: black; +} + +.ui-listview.favoris .category a { + background-color: #7eb73b; + padding-left: 1em; } /*** Popup ***/ @@ -1990,6 +2277,8 @@ form .forms .fields > li:nth-child(even) { width: calc( 90% - 104px ); margin:0 5%; text-align: center; + z-index: 999; + position: absolute; } .popin-btns { @@ -2067,7 +2356,7 @@ a.popin-btn { .forms-list .gwt-Label{ padding-bottom:0.5em; color:#333; - font-size:11pt; + font-size:1.1em; } .workflow-form li:nth-child(odd), @@ -2208,8 +2497,8 @@ a.popin-btn { .liste-news li h2 a, .forms-list h2, .liste-annonces li h2 a { - font-size: 14px; - line-height: 16px; + font-size: 1em; + line-height: 1.1em; color: #555; text-decoration: none; font-weight:500; @@ -2270,7 +2559,7 @@ a.popin-btn { } .ui-list-graduate > li { - background: #f4f4f4 url(packImagesNavigation.png) right -2104px no-repeat; + background: url('icons/expand_more.svg') top right no-repeat; border-bottom: 1px solid #ddd; position: relative; } @@ -2281,17 +2570,20 @@ a.popin-btn { display: inline-block } +.graduate-time { + line-height: 2em; +} + .ui-list-graduate li .nb-event { position: absolute; - right: 1.5em; + right: 2em; top: 0.4em; - background: transparent url(packImagesNavigation.png) right -2176px no-repeat; - padding-right: 2em; - line-height: 14px; + background: transparent url('icons/calendar_today.svg') no-repeat right; + padding-right: 2.5em; } .ui-list-graduate li.open .nb-event { - display: none; + } .ui-list-graduate > li:nth-child(odd) { @@ -2299,12 +2591,12 @@ a.popin-btn { } .ui-list-graduate li.open { - background: #4c4c4c url(packImagesNavigation.png) right -2133px no-repeat; + background: url('icons/expand_less.svg') top right no-repeat; border: 0; } .ui-list-graduate li.open .label { - color: #FFF; + } .ui-list-graduate li ul { @@ -2312,8 +2604,7 @@ a.popin-btn { } .ui-list-graduate li.open ul { - background-color: #4c4c4c; - display: block; + } #list-events .open .ui-listview { @@ -2359,7 +2650,7 @@ a.popin-btn { margin-top: 0.5em; max-width: 80%; text-overflow: ellipsis; - height: 1em; + line-height: 1em; overflow: hidden; white-space: nowrap; } @@ -2370,6 +2661,106 @@ a.popin-btn { padding-left: 1em; } +#eventForm { + padding-top: 2em; +} + +#eventForm .title, #eventForm .allDay { + width: calc(100vw - 4em); + margin-top: 1em; + margin-bottom: 1em; + margin-left: 2em; + line-height: 2em; +} + +#eventForm .title::placeholder { + color: #ec8001; +} + +#eventForm .description { + width: calc(100vw - 4em); + margin-top: 1em; + margin-bottom: 1em; + margin-left: 2em; + border: none; +} + +#eventForm .priority, #eventForm .visibility { + margin-left: 2em; + margin-top: 1em; + margin-bottom: 1em; + display: inline-block; +} + +#eventForm .startDate > label, #eventForm .endDate > label { + width: 3em; + display: inline-block; +} + +#eventForm .title, #eventForm .startDate > input, #eventForm .endDate > input { + line-height: 2em; + border: none; + border-radius: 2px; +} + +#eventForm .startDate, #eventForm .endDate { + display: block; + margin-bottom: 1em; + margin-left: 2em; + float: none; +} + +#eventForm .calendars { + display: block; + margin-left: 2em; +} + +#eventForm .frequency { + display: block; + margin-left: 2em; + margin-bottom: 1em; +} + +#eventForm .calendars > select, #eventForm .frequency > select { + box-sizing: border-box; + padding: 0.5em; + background-color: white; + border-radius: 0.25em; + border: none; +} + +#eventForm .participants { + +} + +#eventForm .participants > label { + margin-left: 2em; +} + +#eventForm .participants > a { + background-color: white; + min-height: 4em; + display: inline-block; + width: calc(100vw - 4em); + margin-left: 2em; + margin-top: 1em; + vertical-align: middle; +} + +#eventForm .participants > a .selection { + color: #333333; +} + +.formMandatoryField { + color: #ec8001; +} + +.formIncomplete { + filter: grayscale(1); +} + + + .termsOfServiceText { text-align: center; margin-top: 2em; @@ -2424,10 +2815,20 @@ a.popin-btn { margin:0.50em 0 ; } +.filter-classifield { + text-align: right; +} + +.filter-classifield span { + padding-right: 1em; +} + .liste-annonces div.thumbnail img{ margin:auto; max-height:125px; max-width:125px; + border-radius: 2px; + box-shadow: 0 0 1em 0 rgba(0, 0, 0, 0.2); } .classified_form { @@ -2576,41 +2977,117 @@ a.popin-btn { padding:1em; } -/********* notification **************/ -.notificationBox .ui-listview.notifications .notification-date { - color:#777; - display:inline-block; - font-size:90%; +/********* sharebox **************/ + +.sharesbox .ui-listview.shares a { + background-color: transparent; } + +.sharesbox .ui-listview.shares .share-date { + font-size:90%; + display:inline-block; + color : #777; + user-select: none; +} + +.sharesbox .ui-listview.shares .share-name { + font-size:90%; + display:block; + color: #70a72e; + user-select: none; +} + +.sharesbox .ui-listview.shares .share-link { + background: url('icons/link.svg') no-repeat; + height: 24px; + width: 24px; + display: block; + float: left; + padding-right: 1em; +} + +.ui-listview.shares li span { + display:block; +} +.ui-listview.shares li { + width: 100%; + padding: 0.75em 0.75em 0.75em 2em; + position: relative; + border-bottom:1px solid #CCC; +} + +.ui-listview.shares li:first-child { + border-top:1px solid #CCC; +} + +.ui-listview.shares li:nth-child(odd){ + background-color: #F0F0F0; +} + +.ui-listview.shares li:nth-child(even){ + background-color: #FFF; +} + +/********* favorites **************/ +.favorite-desc { + display: block; + padding-top: 1em; + overflow:hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +#favoris ul li a { + display: flex; + align-items: center; +} + + + +/********* notification **************/ .notificationBox .ui-listview.notifications input { position:absolute; top:0.5em; left:0.25em; } +.notificationBox .ui-listview.notifications a { + background-color: transparent; +} -.notificationBox .ui-listview.notifications .notification-author{ +.notificationBox .ui-listview.notifications .notification-date, +.notificationBox .ui-listview.notifications .notification-author { font-size:90%; display:inline-block; + color : #777; + user-select: none; } .notificationBox .ui-listview.notifications .notification-source { font-size:90%; + color: #70a72e; + user-select: none; } -.notificationBox .ui-listview.notifications .notification-title{ +.notificationBox .ui-listview.notifications .notification-title{ margin-bottom:0.75em; - font-weight:600; + color: #000; + user-select: none; } + +.notificationBox .notification.not-read a .notification-title { + font-weight: bold; +} + .ui-listview.notifications li span { display:block; } .ui-listview.notifications li{ - padding: 0.75em 0.75em 0.75em 3em; + padding: 0.75em 0.75em 0.75em 2em; position: relative; border-bottom:1px solid #CCC; } -.ui-listview.notifications li:first-child{ +.ui-listview.notifications li:first-child { border-top:1px solid #CCC; } @@ -2622,6 +3099,33 @@ a.popin-btn { background-color: #FFF; } +.markAsRead-notification { + height: 24px; + width: 24px; + filter: invert(1); + background: url('icons/mark_read.svg') no-repeat; +} + +.add-action a, .delete-action a, .markAsRead-notification a, .speak-action a { + height: 24px; + width: 24px; + display: block; +} + +/******** FAQ ********/ +.faq-categories { + width: 90vw; + box-sizing: border-box; + padding-left: 5vw; + background-color: white; + border-radius: 0.25em; + border: none; + box-shadow: 0 0 1em 0 rgba(0, 0, 0, 0.2); + padding-right: 5vw; + line-height: 3em; + height: 2em; +} + /******** Resources Manager ********/ #resourcesManager .list-resources li.category { @@ -2639,7 +3143,7 @@ a.popin-btn { #resourcesManager .reservationDate { font-weight: 600; - font-size: 11pt; + font-size: 1.1em; padding-bottom: 0.5em; } @@ -2716,4 +3220,38 @@ a.popin-btn { #sharing .label { padding-top: 1em; +} + +/**** Cookies information page ****/ +.infosTextContainer { + background-color: white; + min-height: 25vh; + padding: 2em; + margin-left: 1em; + margin-right: 1em; + margin-top: 2em; + border-radius: 0.25em; +} + +.infosText { + min-height: 20vh; + text-align: justify; + line-height: 1.2em; +} +.infosTextActions { + text-align: right; +} + +#header #page-infos-title { + left: 1em; + right: 1em; +} + +/** Profil Page **/ + +#champs-password input { + display: block; + background-color: white; + height: 2em; + width: calc(100vw - 2em); } \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java index 4d4ff5c4c..d42fc80e2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java @@ -25,8 +25,11 @@ package org.silverpeas.mobile.server; import com.fasterxml.jackson.databind.ObjectMapper; +import org.jsoup.Jsoup; import org.silverpeas.core.notification.sse.CDIServerEventListener; import org.silverpeas.core.notification.user.UserNotificationServerEvent; +import org.silverpeas.core.notification.user.server.channel.silvermail.SILVERMAILMessage; +import org.silverpeas.core.notification.user.server.channel.silvermail.SILVERMAILPersistence; import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.mobile.server.services.helpers.NotificationsPushHelper; @@ -48,7 +51,13 @@ public void on(final UserNotificationServerEvent event) { String json = event.getData("", null); Map<String, Object> data = mapper.readValue(json, Map.class); Boolean isCreation = (Boolean) data.get("isCreation"); + String id = (String) data.get("id"); if (Boolean.TRUE.equals(isCreation)) { + SILVERMAILMessage msg = SILVERMAILPersistence.getMessage(event.getEmitterUserId(), Long.valueOf(id)); + String body = msg.getBody(); + body = body.replace("<!--BEFORE_MESSAGE_FOOTER-->", "<!--BEFORE_MESSAGE_FOOTER--> "); + data.put("body", Jsoup.parse(body).wholeText()); + data.put("notificationId", (String) id); NotificationsPushHelper.getInstance().sendNotification(emitterUserId, data); } } catch(Exception e) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java index 0c3940eb8..f2c7df9b9 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java @@ -4,14 +4,18 @@ import org.silverpeas.core.security.authentication.AuthenticationCredential; import org.silverpeas.core.security.authentication.AuthenticationService; import org.silverpeas.core.security.authentication.AuthenticationServiceProvider; +import org.silverpeas.core.security.session.SessionInfo; +import org.silverpeas.core.security.session.SessionManagement; +import org.silverpeas.core.security.session.SessionManagementProvider; import org.silverpeas.core.util.ResourceLocator; import org.silverpeas.core.util.SettingBundle; +import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.core.web.mvc.controller.MainSessionController; import org.silverpeas.core.web.rs.RESTWebService; +import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory; import org.silverpeas.mobile.server.common.CommandCreateList; import org.silverpeas.mobile.shared.StreamingList; import org.silverpeas.mobile.shared.dto.BaseDTO; -import org.silverpeas.mobile.shared.dto.notifications.NotificationSendedDTO; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; @@ -28,7 +32,7 @@ protected static SettingBundle getSettings() { return ResourceLocator.getSettingBundle("org.silverpeas.mobile.mobileSettings"); } - protected MainSessionController getMainSessionController() throws Exception { + protected MainSessionController getMainSessionController() { return (MainSessionController) getHttpRequest().getSession() .getAttribute(MAINSESSIONCONTROLLER_ATTRIBUT_NAME); } @@ -37,13 +41,47 @@ protected void setMainsessioncontroller(String login, String password, String do throws SilverpeasException { AuthenticationService authService = AuthenticationServiceProvider.getService(); AuthenticationCredential credential = AuthenticationCredential.newWithAsLogin(login); - String key = + String response = authService.authenticate(credential.withAsPassword(password).withAsDomainId(domainId)); + String key; + if (response == null) { + key = null; + } else { + key = response; + } MainSessionController mainSessionController = new MainSessionController(key, getHttpRequest().getSession()); } - protected StreamingList createStreamingList(CommandCreateList command, int callNumber, int callSize, String cacheKey) throws Exception { + protected void initSilverpeasSession(HttpServletRequest request) { + MainSessionController controller = (MainSessionController) request.getSession() + .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT); + if (controller == null) { + SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement(); + SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId()); + if (sessionInfo.getSessionId() == null) { + sessionInfo = sessionManagement.openSession(getUser(), request); + } + + try { + controller = new MainSessionController(sessionInfo, request.getSession()); + } catch (SilverpeasException e) { + SilverLogger.getLogger(this).error(e); + } + request.getSession() + .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller); + } + + GraphicElementFactory gef = (GraphicElementFactory) request.getSession() + .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT); + if (gef == null && controller != null) { + gef = new GraphicElementFactory(controller); + request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef); + } + } + + protected StreamingList createStreamingList(CommandCreateList command, int callNumber, + int callSize, String cacheKey) throws Exception { List list; if (callNumber == 0) { list = command.execute(); @@ -55,25 +93,31 @@ protected StreamingList createStreamingList(CommandCreateList command, int callN int calledSize = 0; boolean moreElements = true; - if (callNumber > 0) calledSize = callSize * callNumber; + if (callNumber > 0) { + calledSize = callSize * callNumber; + } if ((calledSize + callSize) >= list.size()) { moreElements = false; callSize = list.size() - calledSize; } - StreamingList<BaseDTO> streamingList = new StreamingList<BaseDTO>(list.subList(calledSize, calledSize + callSize), moreElements); - if (!streamingList.getMoreElement()) getHttpRequest().getSession().removeAttribute(cacheKey); + StreamingList<BaseDTO> streamingList = + new StreamingList<BaseDTO>(list.subList(calledSize, calledSize + callSize), moreElements); + if (!streamingList.getMoreElement()) { + getHttpRequest().getSession().removeAttribute(cacheKey); + } return streamingList; } - protected StreamingList<?> makeStreamingList(int callNumber, String CACHE_NAME, HttpServletRequest request, Populator populator) { + protected StreamingList<?> makeStreamingList(int callNumber, String CACHE_NAME, + HttpServletRequest request, Populator populator) { int callSize = 25; - List<?> list = (List<?>) request.getSession() - .getAttribute(CACHE_NAME); + if (callNumber==0) request.getSession().removeAttribute(CACHE_NAME); + List<?> list = (List<?>) request.getSession().getAttribute(CACHE_NAME); if (list == null) { - list = populator.execute(); - request.getSession().setAttribute(CACHE_NAME, list); + list = populator.execute(); + request.getSession().setAttribute(CACHE_NAME, list); } int calledSize = 0; @@ -88,9 +132,10 @@ protected StreamingList<?> makeStreamingList(int callNumber, String CACHE_NAME, } List<?> sbList = list.subList(calledSize, calledSize + callSize); - StreamingList<?> streamingList = - new StreamingList<>(sbList, moreElements); - if (callNumber == 0) streamingList.setFirstCall(true); + StreamingList<?> streamingList = new StreamingList<>(sbList, moreElements); + if (callNumber == 0) { + streamingList.setFirstCall(true); + } if (!streamingList.getMoreElement()) { getHttpRequest().getSession().removeAttribute(CACHE_NAME); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java index 4f03332f3..cfef071d9 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java @@ -137,6 +137,8 @@ public DetailUserDTO login(List<String> ids) { throw new WebApplicationException(AuthenticationError.CanCreateMainSessionController.name()); } + initSilverpeasSession(request); + DetailUserDTO userDTO = new DetailUserDTO(); userDTO = UserHelper.getInstance().populate(user); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java index f833cff1d..eca7273b3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java @@ -132,7 +132,8 @@ public List<DetailUserDTO> getContacts(@PathParam("type") String type, List tabUserDetail = getUsersByQuery(filter, "UserFull"); for (int i = 0; i < tabUserDetail.size(); i++) { if (i >= startIndex && i < startIndex + pageSize) { - listUsers.add(populate(tabUserDetail.get(i))); + DetailUserDTO dto = populate(tabUserDetail.get(i)); + if (dto != null) listUsers.add(dto); } } } else if (type.equals(ContactFilters.ALL_EXT)) { @@ -320,19 +321,20 @@ private DetailUserDTO populate(Object user) { SilverLogger.getLogger(this).debug(SpMobileLogModule.getName(), "ServiceContact.populate", "User id=" + userDetail.getId()); UserFull userFull = UserFull.getById(userDetail.getId()); - DetailUserDTO dto = new DetailUserDTO(); - dto.setId(userFull.getId()); - dto.setFirstName(userFull.getFirstName()); - dto.setLastName(userFull.getLastName()); - dto.seteMail(userFull.geteMail()); - dto.setStatus(userFull.getStatus()); - dto.setAvatar(userFull.getAvatar()); - dto.setLanguage(userFull.getUserPreferences().getLanguage()); - dto.setConnected(userFull.isConnected()); - String avatar = DataURLHelper.convertAvatarToUrlData(userDetail.getAvatarFileName(), - getSettings().getString("avatar.size", "24x")); - dto.setAvatar(avatar); + DetailUserDTO dto = null; if (userFull != null) { + dto = new DetailUserDTO(); + dto.setId(userFull.getId()); + dto.setFirstName(userFull.getFirstName()); + dto.setLastName(userFull.getLastName()); + dto.seteMail(userFull.getEmailAddress()); + dto.setStatus(userFull.getStatus()); + dto.setAvatar(userFull.getAvatar()); + dto.setLanguage(userFull.getUserPreferences().getLanguage()); + dto.setConnected(userFull.isConnected()); + String avatar = DataURLHelper.convertAvatarToUrlData(userDetail.getAvatarFileName(), + getSettings().getString("avatar.size", "24x")); + dto.setAvatar(avatar); for (String prop : getUserProperties()) { dto.addProperty(prop, userFull.getValue(prop)); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java index c06419e86..f4a448b74 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java @@ -37,27 +37,19 @@ import org.silverpeas.core.admin.user.model.User; import org.silverpeas.core.annotation.WebService; import org.silverpeas.core.comment.service.CommentServiceProvider; -import org.silverpeas.core.contribution.attachment.AttachmentService; import org.silverpeas.core.contribution.attachment.AttachmentServiceProvider; import org.silverpeas.core.contribution.attachment.model.SimpleDocument; import org.silverpeas.core.contribution.attachment.model.SimpleDocumentPK; -import org.silverpeas.core.contribution.publication.model.CompletePublication; -import org.silverpeas.core.contribution.publication.model.PublicationDetail; -import org.silverpeas.core.contribution.publication.model.PublicationLink; -import org.silverpeas.core.contribution.publication.model.PublicationPK; +import org.silverpeas.core.contribution.attachment.util.SimpleDocumentList; +import org.silverpeas.core.contribution.publication.model.*; import org.silverpeas.core.contribution.publication.service.PublicationService; import org.silverpeas.core.io.media.image.thumbnail.ThumbnailSettings; import org.silverpeas.core.node.model.NodeDetail; import org.silverpeas.core.node.model.NodePK; import org.silverpeas.core.node.service.NodeService; import org.silverpeas.core.sharing.services.SharingServiceProvider; -import org.silverpeas.core.sharing.services.SharingTicketService; import org.silverpeas.core.silverstatistics.access.service.StatisticService; -import org.silverpeas.core.util.LocalizationBundle; -import org.silverpeas.core.util.ResourceLocator; -import org.silverpeas.core.util.ServiceProvider; -import org.silverpeas.core.util.SettingBundle; -import org.silverpeas.core.util.StringUtil; +import org.silverpeas.core.util.*; import org.silverpeas.core.util.file.FileServerUtils; import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.core.web.rs.UserPrivilegeValidation; @@ -348,6 +340,8 @@ public List<PublicationDTO> getPublications(@PathParam("appId") String instanceI PublicationDTO dto = new PublicationDTO(); dto.setId(publicationDetail.getId()); dto.setVignette(getVignetteUrl(publicationDetail)); + dto.setDraft(publicationDetail.isDraft()); + dto.setPublishable(isPublishable(publicationDetail)); if (publicationDetail.isDraft()) { if (publicationDetail.getUpdaterId().equals(getUser().getId())) { @@ -423,6 +417,10 @@ public PublicationDTO getPublication(@PathParam("id") String id, .debug("ServiceDocumentsImpl.getPublication", "getPublication for id " + id); try { + final String userLanguage = getUser().getUserPreferences().getLanguage(); + LocalizationBundle resource = + ResourceLocator.getLocalizationBundle("org.silverpeas.mobile.multilang.mobileBundle", + userLanguage); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); PublicationDetail pub = getPubBm().getDetail(new PublicationPK(id)); @@ -431,11 +429,16 @@ public PublicationDTO getPublication(@PathParam("id") String id, dto.setId(pub.getId()); dto.setName(pub.getName()); dto.setCreator(pub.getCreator().getDisplayedName()); + dto.setPublishable(isPublishable(pub)); dto.setUpdater(organizationController.getUserDetail(pub.getUpdaterId()).getDisplayedName()); dto.setVersion(pub.getVersion()); + dto.setDraft(pub.isDraft()); + if (pub.isDraft()) dto.setName(pub.getName() + " (" + resource.getString("publication.draft") + ")"); + dto.setDescription(pub.getDescription()); dto.setUpdateDate(sdf.format(pub.getLastUpdateDate())); dto.setCreationDate(sdf.format(pub.getCreationDate())); + dto.setNotAllowedDownloads(new ArrayList<>()); if (type.equals(ContentsTypes.Publication.toString())) { try { @@ -444,6 +447,18 @@ public PublicationDTO getPublication(@PathParam("id") String id, } catch (Exception e) { SilverLogger.getLogger(this).warn("Unable to get views number", e); } + + // List all attachements not downloadable for readers + ResourceReference foreignKey = new ResourceReference(id, componentId); + SimpleDocumentList<SimpleDocument> attachements = AttachmentServiceProvider.getAttachmentService().listAllDocumentsByForeignKey(foreignKey, null); + ArrayList<String> notAllowedDownloads = new ArrayList<>(); + for (SimpleDocument attachement : attachements) { + if (!attachement.isDownloadAllowedForReaders() && !attachement.canBeModifiedBy(getUser())) { + notAllowedDownloads.add(attachement.getId()); + } + } + dto.setNotAllowedDownloads(notAllowedDownloads); + } else if (type.equals(ContentsTypes.News.toString())) { dto.setViewsNumber(QuickInfoService.get().getNews(contributionId).getNbAccess()); } else { @@ -606,6 +621,83 @@ public List<BaseDTO> getTopicsAndPublications(@PathParam("appId") String instanc return list; } + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("nextpublication/{id}/{direction}") + public PublicationDTO getNextPublication(@PathParam("appId") String instanceId, @PathParam("id") String id, @PathParam("direction") String direction) throws Exception { + + PublicationDTO dto = new PublicationDTO(); + try { + PublicationPK pubPK = new PublicationPK(id); + PublicationDetail pub = getPubBm().getDetail(pubPK); + + List<Location> locations = getPubBm().getAllLocations(pubPK); + String folderId = locations.get(0).getLocalId(); + + + NodePK nodePK = new NodePK(folderId, instanceId); + List<KmeliaPublication> publications = KmeliaService.get().getAuthorizedPublicationsOfFolder(nodePK, + getUserTopicProfile(nodePK.getId(), instanceId), getUser().getId(), + isTreeStructure(instanceId)); + + + int sort; + if (isManualSortingUsed(publications)) { + sort = 99; + } else { + sort = getDefaultSortValue(pubPK.getInstanceId()); + } + new KmeliaPublicationSort(sort).withContentLanguage(getUser().getUserPreferences().getLanguage()).sort(publications); + + KmeliaPublication next = null; + for (int i = 0; i < publications.size(); i++) { + if (publications.get(i).getId().equals(id)) { + if (direction.equalsIgnoreCase("right")) { + if (i == publications.size() - 1) { + next = publications.get(0); + } else { + next = publications.get(i + 1); + } + } else if (direction.equalsIgnoreCase("left")) { + if (i == 0) { + next = publications.get(publications.size() - 1); + } else { + next = publications.get(i - 1); + } + } + } + } + + dto.setId(next.getId()); + dto.setName(next.getName()); + dto.setDescription(next.getDescription()); + + } catch(Throwable e) { + SilverLogger.getLogger(this) + .error("ServiceDocumentsImpl.getNextPublication", "root.EX_NO_MESSAGE", e); + throw e; + } + + return dto; + } + + private boolean isPublishable(PublicationDetail pub) { + return pub.canBeModifiedBy(getUser()); + } + + @POST + @Path("publish/{pubId}") + @Produces(MediaType.APPLICATION_JSON) + public PublicationDTO publish(@PathParam("appId") String appId, @PathParam("pubId") String pubId) throws Exception { + CompletePublication pub = PublicationService.get().getCompletePublication(new PublicationPK(pubId)); + NodePK nodePK = KmeliaService.get().getPublicationFatherPK(new PublicationPK(pubId, pub.getPublicationDetail().getInstanceId())); + String profile = getUserTopicProfile(nodePK.getId(), appId); + KmeliaService.get().draftOutPublication(new PublicationPK(pubId), new NodePK(nodePK.getId(), appId), profile); + PublicationDTO dto = new PublicationDTO(); + dto.setName(pub.getPublicationDetail().getName(getUser().getUserPreferences().getLanguage())); + return dto; + } + @Override protected String getResourceBasePath() { return PATH; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java index 416b167ae..186e7f6e5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java @@ -29,6 +29,7 @@ import org.silverpeas.core.admin.service.Administration; import org.silverpeas.core.annotation.WebService; import org.silverpeas.core.web.rs.annotation.Authorized; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -53,17 +54,21 @@ public class ServiceHyperLink extends AbstractRestWebService { static final String PATH = "mobile/hyperlink"; @GET - @Produces(MediaType.TEXT_PLAIN) + @Produces(MediaType.APPLICATION_JSON) @Path("/") - public String getUrl() { - String url = ""; + public HyperLinkDTO getUrl() { + HyperLinkDTO dto = new HyperLinkDTO(); try { ComponentInstLight app = Administration.get().getComponentInstLight(componentId); - url = app.getParameterValue("URL"); + dto.setUrl(app.getParameterValue("URL")); + String v = app.getParameterValue("openNewWindow"); + dto.setOpenNewWindow(v.equalsIgnoreCase("yes")); + v = app.getParameterValue("isInternalLink"); + dto.setInternalLink(v.equalsIgnoreCase("yes")); } catch (AdminException e) { throw new WebApplicationException(e); } - return url; + return dto; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java index 9242b31cc..d2ee200d6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java @@ -174,38 +174,6 @@ private String createPhoto(String name, String userId, String componentId, return newMedia.getId(); } - - /** - * Retourne la listes des galleries accessibles. - */ - @GET - @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Path("allGalleries") - public List<ApplicationInstanceDTO> getAllGalleries(){ - - ArrayList<ApplicationInstanceDTO> results = new ArrayList<ApplicationInstanceDTO>(); - try { - String [] rootSpaceIds = Administration.get().getAllRootSpaceIds(); - for (String rootSpaceId : rootSpaceIds) { - String [] componentIds = Administration.get().getAvailCompoIds(rootSpaceId); - for (String componentId : componentIds) { - ComponentInstLight instance = Administration.get().getComponentInstLight(componentId); - if (instance.getName().equals("gallery")) { - ApplicationInstanceDTO i = new ApplicationInstanceDTO(); - i.setId(instance.getId()); - i.setLabel(instance.getLabel()); - results.add(i); - } - } - } - } catch (Exception e) { - SilverLogger.getLogger(this).error("ServiceMediaImpl.getAllGalleries", "root.EX_NO_MESSAGE", e); - } - - Collections.sort(results); - return results; - } - /** * Retourne la liste des albums d'une appli media. */ @@ -296,7 +264,7 @@ private List<MediaDTO> getMedias(String instanceId, String albumId) throws Media @GET @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) @Path("media/{id}") - public MediaDTO getMedia(@PathParam("id") String id) { + public MediaDTO getMedia(@PathParam("appId") String instanceId, @PathParam("id") String id) { MediaDTO dto = null; try { Media media = getGalleryService().getMedia(new MediaPK(id)); @@ -400,7 +368,7 @@ public VideoStreamingDTO getVideoStreaming(@PathParam("appId") String instanceId */ @GET @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Path("videostream/{pictureId}") + @Path("photo/{pictureId}") public PhotoDTO getPreviewPicture(@PathParam("appId") String instanceId, @PathParam("pictureId") String pictureId) { PhotoDTO picture = null; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMyLinks.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMyLinks.java new file mode 100644 index 000000000..39bdd1838 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMyLinks.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.server.services; + +import org.fusesource.restygwt.client.MethodCallback; +import org.fusesource.restygwt.client.RestService; +import org.silverpeas.mobile.shared.dto.MyLinkCategoryDTO; +import org.silverpeas.mobile.shared.dto.MyLinkDTO; +import org.silverpeas.mobile.shared.dto.comments.CommentDTO; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import java.util.List; + +/** + * @author svu + */ +@Path("/mylinks") +public interface ServiceMyLinks extends RestService { + + + @POST + @Path("/") + public void addLink(MyLinkDTO newLink, MethodCallback<MyLinkDTO> callback); + + @GET + @Path("/") + public void getMyLinks(MethodCallback<List<MyLinkDTO>> callback); + + @DELETE + @Path("{linkId}") + public void deleteLink(final @PathParam("linkId") String linkId, MethodCallback<Void> callback); + + @GET + @Path("categories") + @Produces(MediaType.APPLICATION_JSON) + public void getMyCategories(MethodCallback<List<MyLinkCategoryDTO>> callback); + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java index 6e7accd5c..760a66821 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java @@ -25,14 +25,10 @@ package org.silverpeas.mobile.server.services; import org.apache.commons.lang3.EnumUtils; -import org.jsoup.Connection; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; import org.silverpeas.components.gallery.model.Media; import org.silverpeas.components.gallery.model.MediaPK; import org.silverpeas.components.gallery.service.MediaServiceProvider; import org.silverpeas.components.quickinfo.model.News; -import org.silverpeas.core.SilverpeasException; import org.silverpeas.core.admin.component.model.ComponentInst; import org.silverpeas.core.admin.component.model.ComponentInstLight; import org.silverpeas.core.admin.service.AdminException; @@ -47,15 +43,11 @@ import org.silverpeas.core.contribution.publication.model.PublicationPK; import org.silverpeas.core.contribution.publication.service.PublicationService; import org.silverpeas.core.mylinks.model.LinkDetail; -import org.silverpeas.core.security.session.SessionInfo; -import org.silverpeas.core.security.session.SessionManagement; -import org.silverpeas.core.security.session.SessionManagementProvider; import org.silverpeas.core.security.token.synchronizer.SynchronizerToken; import org.silverpeas.core.util.SettingBundle; import org.silverpeas.core.util.StringUtil; import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.core.web.look.PublicationHelper; -import org.silverpeas.core.web.mvc.controller.MainSessionController; import org.silverpeas.core.web.rs.UserPrivilegeValidation; import org.silverpeas.core.web.rs.annotation.Authorized; import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory; @@ -66,24 +58,15 @@ import org.silverpeas.mobile.server.services.helpers.UserHelper; import org.silverpeas.mobile.server.services.helpers.events.EventsHelper; import org.silverpeas.mobile.server.services.helpers.events.NextEvents; -import org.silverpeas.mobile.shared.dto.ContentsTypes; -import org.silverpeas.mobile.shared.dto.DetailUserDTO; -import org.silverpeas.mobile.shared.dto.HomePageDTO; -import org.silverpeas.mobile.shared.dto.RightDTO; -import org.silverpeas.mobile.shared.dto.ShortCutLinkDTO; +import org.silverpeas.mobile.shared.dto.*; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; -import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; -import org.silverpeas.mobile.shared.dto.navigation.Apps; -import org.silverpeas.mobile.shared.dto.navigation.HomePages; -import org.silverpeas.mobile.shared.dto.navigation.SilverpeasObjectDTO; -import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO; +import org.silverpeas.mobile.shared.dto.navigation.*; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; -import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -193,33 +176,6 @@ private DetailUserDTO initSession(DetailUserDTO user) { } } - private void initSilverpeasSession() { - MainSessionController controller = (MainSessionController) request.getSession() - .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT); - if (controller == null) { - SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement(); - SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId()); - if (sessionInfo.getSessionId() == null) { - sessionInfo = sessionManagement.openSession(getUser(), request); - } - - try { - controller = new MainSessionController(sessionInfo, request.getSession()); - } catch (SilverpeasException e) { - SilverLogger.getLogger(this).error(e); - } - request.getSession() - .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller); - } - - GraphicElementFactory gef = (GraphicElementFactory) request.getSession() - .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT); - if (gef == null && controller != null) { - gef = new GraphicElementFactory(controller); - request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef); - } - } - protected void setUserInSession(UserDetail user) { request.getSession().setAttribute(AbstractAuthenticateService.USER_ATTRIBUT_NAME, user); } @@ -230,11 +186,12 @@ protected UserDetail getUserInSession() { @GET @Produces(MediaType.APPLICATION_JSON) - @Path("homepage/{spaceId}/") - public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) { + @Path("homepage/{spaceId}/{zoom}/") + public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId, @PathParam("zoom") String zoom) { if (spaceId.equals("null")) spaceId = null; - initSilverpeasSession(); + initSilverpeasSession(request); + request.getSession().setAttribute("Silverpeas_Portlet_SpaceId", spaceId); String look = ""; try { @@ -273,15 +230,15 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) { if (spaceId == null) { maxNews = settings.getInteger("home.news.size", 3); } else { - maxNews = settings.getInteger("home.news.size", 3); - } - List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId); - if (lastNews != null && lastNews.size() > maxNews) { - lastNews = lastNews.subList(0, maxNews); + maxNews = settings.getInteger("space.homepage.news.nb", 3); } - data.setNews(NewsHelper.getInstance().populate(lastNews, false)); - + if ((spaceId == null && getSettings().getBoolean("homepage.lastnews", true)) || + (spaceId != null && getSettings().getBoolean("spacehomepage.lastnews", true))) { + List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId, maxNews); + data.setNews(NewsHelper.getInstance().populate(lastNews, false)); + } + if (spaceId == null || spaceId.isEmpty()) { List<LinkDetail> links = FavoritesHelper.getInstance().getBookmarkPersoVisible(getUser().getId()); @@ -396,16 +353,21 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) { String pageWebAppId = settings.getString("home.freezone.appId", ""); if (pageWebAppId != null && !pageWebAppId.isEmpty() && isComponentAvailable(pageWebAppId)) { String html = WysiwygController.loadForReadOnly(pageWebAppId, pageWebAppId, lang); + html = "<div style='zoom:"+zoom+"'>" + html + "</div>"; data.setHtmlFreeZone(html); } } else if (spaceId != null) { SpaceInst space = Administration.get().getSpaceInstById(spaceId); - if (space.getFirstPageType() == HomePages.URL.getValue()) { - String html = - "<iframe frameborder='0' onLoad='javaScript:this.height = this.contentWindow" + - ".document.body" + - ".scrollHeight ;' style='width:100%;' src='" + space.getFirstPageExtraParam() + - "'></iframe>"; + if (space.getFirstPageType() == HomePages.URL.getValue() && + getSettings().getBoolean("spacehomepage.displayUrlType")) { + String url = space.getFirstPageExtraParam(); + if (url.startsWith("/") && !url.startsWith("/silverpeas") && !url.startsWith("$")) url = "/silverpeas" + url; + String html = getIframe(url, zoom); + data.setHtmlFreeZone(html); + } else if (space.getFirstPageType() == HomePages.APP.getValue() && space.getFirstPageExtraParam().startsWith("webPage")) { + String appId = space.getFirstPageExtraParam(); + String url = "/silverpeas/services/spmobile/PublicationContent" + "?id=" + appId + "&componentId=" + appId; + String html = getIframe(url, zoom); data.setHtmlFreeZone(html); } } @@ -427,6 +389,18 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) { return data; } + private String getIframe(String url, String zoom) { + String style = "border-style: none; width: 100%; overflow: hidden;"; + + String script = "o.contentWindow.document.body.style='zoom:" + zoom + "'; "; + script += "var h = o.contentWindow.document.body.scrollHeight;"; + script += "o.style.height=h+'px'; "; + + String html = "<iframe style='" + style + "' src='" + url + "' onload=\"" + "javascript:(function(o){" + script + "}(this));" + "\" scrolling='no'>"; + html += "</iframe>"; + return html; + } + private List<ComponentInstLight> getAllowedComponents(boolean visibleOnly, String name, String spaceId) { OrganizationController oc = OrganizationController.get(); @@ -507,6 +481,40 @@ public Boolean isWorkflowApp(@PathParam("instanceId") String intanceId) { } } + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("personalSpace/{userId}/") + public List<ApplicationInstanceDTO> getPersonnalSpaceContent(@PathParam("userId") String userId) { + try { + SpaceInst space = Administration.get().getPersonalSpace(userId); + List<ApplicationInstanceDTO> apps = new ArrayList<>(); + for (ComponentInst app : space.getAllComponentsInst()) { + ApplicationInstanceDTO dto = populate(app, true); + apps.add(dto); + } + return apps; + } catch (AdminException e) { + SilverLogger.getLogger(this).error(e); + throw new WebApplicationException(e); + } + } + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("space/{spaceId}/") + public SpaceDTO getSpace(@PathParam("spaceId") String spaceId) { + try { + SpaceInst space = Administration.get().getSpaceInstById(spaceId); + SpaceDTO dto = new SpaceDTO(); + dto.setHomePageType(space.getFirstPageType()); + dto.setHomePageParameter(space.getFirstPageExtraParam()); + return dto; + } catch (AdminException e) { + SilverLogger.getLogger(this).error(e); + throw new WebApplicationException(e); + } + } + //TODO : remove appType @GET @Produces(MediaType.APPLICATION_JSON) @@ -516,7 +524,7 @@ public List<SilverpeasObjectDTO> getSpacesAndApps(@PathParam("rootSpaceId") Stri if (rootSpaceId !=null && rootSpaceId.equals("null")) rootSpaceId = null; try { if (rootSpaceId == null) { - String[] spaceIds = Administration.get().getAllSpaceIds(getUser().getId()); + String[] spaceIds = Administration.get().getAllRootSpaceIds(getUser().getId()); for (String spaceId : spaceIds) { SpaceInst space = Administration.get().getSpaceInstById(spaceId); if (!space.isRemoved()) { @@ -549,7 +557,8 @@ public List<SilverpeasObjectDTO> getSpacesAndApps(@PathParam("rootSpaceId") Stri ComponentInstLight app = Administration.get().getComponentInstLight(appId); if (isSupportedApp(app) && app.getDomainFatherId().equals(rootSpaceId)) { if (!app.isHidden()) { - partialResults.add(populate(app)); + SpaceInst space = Administration.get().getSpaceInstById(app.getDomainFatherId()); + partialResults.add(populate(app, space.isPersonalSpace())); } } } @@ -597,7 +606,8 @@ private ApplicationInstanceDTO getApplicationInstanceDTO(final String instanceId ApplicationInstanceDTO dto = null; try { ComponentInstLight app = Administration.get().getComponentInstLight(instanceId); - dto = populate(app); + SpaceInst space = Administration.get().getSpaceInstById(app.getDomainFatherId()); + dto = populate(app,space.isPersonalSpace()); } catch (Exception e) { SilverLogger.getLogger(this).error(e); } @@ -654,14 +664,24 @@ private SpaceDTO populate(SpaceInst space) { return dto; } + private ApplicationInstanceDTO populate(ComponentInst app, boolean personal) { + ApplicationInstanceDTO dto = new ApplicationInstanceDTO(); + dto.setId(app.getId()); + dto.setLabel(app.getLabel()); + dto.setType(app.getName()); + dto.setOrderNum(app.getOrderNum()); + dto.setPersonnal(personal); + return dto; + } - private ApplicationInstanceDTO populate(ComponentInstLight app) { + private ApplicationInstanceDTO populate(ComponentInstLight app,boolean personal) { ApplicationInstanceDTO dto = new ApplicationInstanceDTO(); dto.setId(app.getId()); dto.setLabel(app.getLabel()); dto.setType(app.getName()); dto.setOrderNum(app.getOrderNum()); dto.setWorkflow(isWorkflowApp(app)); + dto.setPersonnal(personal); RightDTO rights = new RightDTO(); String[] roles = getUserRoles(app.getId(), getUser().getId()); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java index e260a3df9..6c4827549 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java @@ -56,6 +56,7 @@ import org.silverpeas.core.web.rs.UserPrivilegeValidation; import org.silverpeas.core.web.rs.annotation.Authorized; import org.silverpeas.mobile.server.helpers.DataURLHelper; +import org.silverpeas.mobile.server.services.helpers.UserHelper; import org.silverpeas.mobile.shared.StreamingList; import org.silverpeas.mobile.shared.dto.BaseDTO; import org.silverpeas.mobile.shared.dto.GroupDTO; @@ -116,7 +117,7 @@ public List<?> execute() { SentNotificationInterface.get().getAllNotifByUser(getUser().getId()); for (SentNotificationDetail notif : notifications) { NotificationSendedDTO dto = new NotificationSendedDTO(); - dto.setSource(notif.getSource()); + dto.setSource(notif.getBody()); dto.setDate(sdf.format(notif.getNotifDate())); dto.setLink(notif.getLink()); dto.setTitle(notif.getTitle()); @@ -183,9 +184,7 @@ public List<BaseDTO> getAllowedUsersAndGroups(@PathParam("componentId") String c users.add(populate(user)); } for (GroupDetail group : Administration.get().getAllGroups()) { - GroupDTO g = new GroupDTO(); - g.setId(group.getId()); - g.setName(group.getName()); + GroupDTO g =UserHelper.getInstance().populateGroupDTO(group); groups.add(g); } } else { @@ -223,9 +222,7 @@ public List<BaseDTO> getAllowedUsersAndGroups(@PathParam("componentId") String c for (String groupId : profile.getAllGroups()) { if (!isGroupPresent(groups, groupId)) { Group group = organizationController.getGroup(groupId); - GroupDTO g = new GroupDTO(); - g.setId(group.getId()); - g.setName(group.getName()); + GroupDTO g = UserHelper.getInstance().populateGroupDTO(group); groups.add(g); } } @@ -289,7 +286,7 @@ private UserDTO populate(UserDetail userDetail) { u.setId(userDetail.getId()); u.setFirstName(userDetail.getFirstName()); u.setLastName(userDetail.getLastName()); - u.seteMail(userDetail.geteMail()); + u.seteMail(userDetail.getEmailAddress()); String avatar = DataURLHelper.convertAvatarToUrlData(userDetail.getAvatarFileName(), getSettings().getString("avatar.size", "24x")); u.setAvatar(avatar); @@ -365,10 +362,10 @@ private List<String> getSelectionIds(List<NotificationBoxDTO> selection) { @Consumes(MediaType.APPLICATION_JSON) @Path("") public void delete(List<NotificationBoxDTO> selection) { - if (selection.get(0) instanceof NotificationSendedDTO) { + if (selection.get(0).isSended()) { for (NotificationBoxDTO dto : selection) { try { - SentNotificationInterface.get().deleteNotif((int) dto.getIdNotif(), getUser().getId()); + SentNotificationInterface.get().deleteNotif(getUser().getId(), (int) dto.getIdNotif()); } catch (NotificationException e) { SilverLogger.getLogger(this).error(e); } @@ -409,7 +406,11 @@ public void send(NotificationToSendDTO notificationToSendDTO) throws Exception { if (notificationToSendDTO.getNotification().getContentType() .equals(NotificationDTO.TYPE_PUBLICATION)) { String url = silverpeasServerUrl + "/Publication/" + - notificationToSendDTO.getNotification().getContentId(); + notificationToSendDTO.getNotification().getContentId(); + metaData.setLink(url); + } else if (notificationToSendDTO.getNotification().getContentType().equals(NotificationDTO.TYPE_DOCUMENT)) { + String url = silverpeasServerUrl + "/services/media/viewer/embed/pdf?documentId=" + + notificationToSendDTO.getNotification().getContentId() + "&documentType=attachment&embedPlayer=true"; metaData.setLink(url); } else if (notificationToSendDTO.getNotification().getContentType() .equals(NotificationDTO.TYPE_PHOTO) || @@ -432,7 +433,7 @@ public void send(NotificationToSendDTO notificationToSendDTO) throws Exception { } metaData.setAnswerAllowed(false); metaData.setContent(notificationToSendDTO.getNotification().getMessage()); - metaData.setSender(getUser().geteMail()); + metaData.setSender(getUser().getEmailAddress()); ComponentInst app = Administration.get() .getComponentInst(notificationToSendDTO.getNotification().getInstanceId()); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceTask.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceTask.java index 270cb78e4..6d9ac57c4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceTask.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceTask.java @@ -38,12 +38,7 @@ import org.silverpeas.mobile.shared.dto.TaskDTO; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; +import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import java.text.SimpleDateFormat; @@ -95,6 +90,16 @@ public void updateTask(TaskDTO task) { getCalendar().updateToDo(todo); } + @DELETE + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @Path("") + public void deleteTasks(List<TaskDTO> tasks) { + for (TaskDTO task : tasks) { + getCalendar().removeToDo(task.getId()); + } + } + @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java index 988e1f1b6..d33260c09 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java @@ -36,18 +36,13 @@ import org.silverpeas.core.admin.service.AdminException; import org.silverpeas.core.admin.service.Administration; import org.silverpeas.core.admin.service.OrganizationController; +import org.silverpeas.core.admin.user.model.UserDetail; import org.silverpeas.core.contribution.publication.model.PublicationDetail; -import org.silverpeas.core.contribution.publication.service.PublicationService; import org.silverpeas.core.io.file.ImageResizingProcessor; import org.silverpeas.core.io.file.SilverpeasFileProcessor; -import org.silverpeas.core.util.CollectionUtil; -import org.silverpeas.core.util.ResourceLocator; -import org.silverpeas.core.util.ServiceProvider; -import org.silverpeas.core.util.SettingBundle; -import org.silverpeas.core.util.StringUtil; +import org.silverpeas.core.util.*; import org.silverpeas.core.util.file.FileRepositoryManager; import org.silverpeas.core.util.logging.SilverLogger; -import org.silverpeas.core.web.look.PublicationUpdateDateComparator; import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory; import org.silverpeas.mobile.shared.dto.news.NewsDTO; @@ -55,12 +50,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.MissingResourceException; +import java.util.*; /** * @author: svu @@ -80,8 +70,8 @@ public static NewsHelper getInstance() { return instance; } - public List<News> getLastNews(String userId, String spaceId) throws Exception { - if(spaceId != null) { + public List<News> getLastNews(String userId, String spaceId, int maxNews) throws Exception { + if (spaceId != null) { List<String> appIds = new ArrayList<String>(); String[] cIds = organizationController.getAvailCompoIds(spaceId, userId); for (String id : cIds) { @@ -94,7 +84,7 @@ public List<News> getLastNews(String userId, String spaceId) throws Exception { for (String appId : appIds) { news.addAll(service.getVisibleNews(appId)); } - Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate())); + news = sortAndTruncate(maxNews, news, false); return news; } else { // News on main page @@ -106,15 +96,18 @@ public List<News> getLastNews(String userId, String spaceId) throws Exception { } catch (MissingResourceException e) {} if (newsSource != null && newsSource.isEmpty() == false) { if (newsSource.trim().startsWith("quickinfo")) { - news = getNewsByComponentId(newsSource, false, userId); + String [] sources = newsSource.split(" "); + for (String source : sources) { + news.addAll(getNewsByComponentId(source.trim(), false, userId, maxNews)); + } + news = sortAndTruncate(maxNews, news, true); } else if (newsSource.trim().equals("*")) { - news = getAllNews(userId); + news = getAllNews(userId, maxNews); + news = sortAndTruncate(maxNews, news, true); } else { - news = getDelegatedNews(userId); + news = getDelegatedNews(userId, maxNews); } } - Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate())); - Collections.reverse(news); return news; } } @@ -123,21 +116,39 @@ private boolean isVisibleNews(PublicationDetail news) { return news.isValid() && news.isVisible(); } - private List<News> getDelegatedNews(String userId) throws Exception { + private List<News> getDelegatedNews(String userId, int maxNews) throws Exception { List<News> news = new ArrayList(); List<DelegatedNews> delegatedNews = DelegatedNewsServiceProvider.getDelegatedNewsService().getAllValidDelegatedNews(); - + UserDetail u = Administration.get().getUserDetail(userId); + Date now = new Date(); + int count = 0; for (DelegatedNews delegated : delegatedNews) { - PublicationDetail pub = delegated.getPublicationDetail(); - if (pub.canBeAccessedBy(Administration.get().getUserDetail(userId))) { - News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId()); + if (count >= maxNews) break; + News aNews = null; + if (delegated.getBeginDate() == null && delegated.getEndDate() == null) { + aNews = getNews(delegated, u); + } else if (delegated.getBeginDate() != null && now.after(delegated.getBeginDate()) + && delegated.getEndDate() != null && now.before(delegated.getEndDate())) { + aNews = getNews(delegated, u); + } else if (delegated.getBeginDate() != null && now.after(delegated.getBeginDate()) && delegated.getEndDate() == null) { + aNews = getNews(delegated, u); + } else if (delegated.getEndDate() != null && now.before(delegated.getEndDate())) { + aNews = getNews(delegated, u); + } + if (aNews != null) { news.add(aNews); + count++; } } - return news; } + private News getNews(DelegatedNews delegated, UserDetail u) { + News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId()); + if (!aNews.canBeAccessedBy(u)) aNews = null; + return aNews; + } + public List<News> getNewsByAppId(String appId, boolean managerAccess) { QuickInfoService service = QuickInfoServiceProvider.getQuickInfoService(); List<News> news; @@ -150,19 +161,19 @@ public List<News> getNewsByAppId(String appId, boolean managerAccess) { return news; } - private List<News> getAllNews(String userId) throws AdminException { + private List<News> getAllNews(String userId, int maxNews) throws AdminException { List<News> news = new ArrayList<>(); List<String> apps = CollectionUtil .asList(organizationController.getComponentIdsForUser(userId, "quickinfo")); for (String appId : apps) { - news.addAll(getNewsByComponentId(appId, false, userId)); + news.addAll(getNewsByComponentId(appId, false, userId, maxNews)); } - //TODO sort list + news = sortAndTruncate(maxNews, news, false); return news; } - private List<News> getNewsByComponentId(String appId, boolean managerAccess, String userId) throws AdminException { + private List<News> getNewsByComponentId(String appId, boolean managerAccess, String userId, int maxNews) throws AdminException { QuickInfoService service = QuickInfoServiceProvider.getQuickInfoService(); List<News> news = new ArrayList<>(); @@ -173,6 +184,17 @@ private List<News> getNewsByComponentId(String appId, boolean managerAccess, Str news = service.getVisibleNews(appId); } } + news = sortAndTruncate(maxNews, news, false); + + return news; + } + + private static List<News> sortAndTruncate(int maxNews, List<News> news, boolean reverse) { + Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate())); + if (reverse) Collections.reverse(news); + if (news != null && news.size() > maxNews) { + news = news.subList(0, maxNews); + } return news; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java index 8eb22cfec..5a6128e46 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java @@ -130,11 +130,13 @@ public String sendToToken(final String userId, String token, Map<String, Object> // This registration token comes from the client FCM SDKs. // See documentation on defining a message payload. - response = getNotificationPermalink(String.valueOf(notifData.get("id"))) + response = getNotificationPermalink(userId, String.valueOf(notifData.get("id"))) // No push if no permalink .map(l -> Message.builder() .putData("subject", String.valueOf(notifData.get("subject"))) .putData("sender", String.valueOf(notifData.get("sender"))) + .putData("body", String.valueOf(notifData.get("body"))) + .putData("notificationId", String.valueOf(notifData.get("notificationId"))) .putData("permalink", l)) .map(m -> m.setToken(token)) .map(Message.Builder::build) @@ -156,10 +158,8 @@ public String sendToToken(final String userId, String token, Map<String, Object> return response; } - private Optional<String> getNotificationPermalink(String id) { - return ofNullable(id) - .map(Long::decode) - .map(SILVERMAILPersistence::getMessage) - .map(SILVERMAILMessage::getUrl); + private Optional<String> getNotificationPermalink(String userId, String id) { + SILVERMAILMessage m = SILVERMAILPersistence.getMessage(userId, Long.valueOf(id)); + return ofNullable(m.getUrl()); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/UserHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/UserHelper.java index b151d7f22..ded67d292 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/UserHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/UserHelper.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.server.services.helpers; import org.silverpeas.core.admin.service.Administration; +import org.silverpeas.core.admin.user.model.Group; import org.silverpeas.core.admin.user.model.GroupDetail; import org.silverpeas.core.admin.user.model.UserDetail; import org.silverpeas.core.notification.NotificationException; @@ -65,12 +66,14 @@ public DetailUserDTO populate(UserDetail user) { dto.setId(user.getId()); dto.setFirstName(user.getFirstName()); dto.setLastName(user.getLastName()); - dto.seteMail(user.geteMail()); + dto.seteMail(user.getEmailAddress()); dto.setStatus(user.getStatus()); dto.setAvatar(user.getAvatar()); dto.setLanguage(user.getUserPreferences().getLanguage()); dto.setToken(user.getToken()); dto.setZone(user.getUserPreferences().getZoneId().getId()); + dto.setLdap(!user.getDomain().getDriverClassName() + .equals("org.silverpeas.core.admin.domain.driver.SilverpeasDomainDriver")); boolean notificationBox = false; List<Properties> channels = null; @@ -97,17 +100,18 @@ public UserDTO populateUserDTO(UserDetail user) { dto.setId(user.getId()); dto.setFirstName(user.getFirstName()); dto.setLastName(user.getLastName()); - dto.seteMail(user.geteMail()); + dto.seteMail(user.getEmailAddress()); String avatar = DataURLHelper.convertAvatarToUrlData(user.getAvatarFileName(), getSettings().getString("avatar.size", "24x")); dto.setAvatar(avatar); return dto; } - public GroupDTO populateGroupDTO(GroupDetail group) { + public GroupDTO populateGroupDTO(Group group) { GroupDTO dto = new GroupDTO(); dto.setId(group.getId()); dto.setName(group.getName()); + dto.setNbMembers(group.getNbUsers()); return dto; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/FileServlet.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/FileServlet.java new file mode 100644 index 000000000..1d45e6c01 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/FileServlet.java @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.server.servlets; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadBase; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.io.FileUtils; +import org.silverpeas.components.kmelia.service.KmeliaService; +import org.silverpeas.core.contribution.publication.model.PublicationDetail; +import org.silverpeas.core.contribution.publication.model.PublicationPK; +import org.silverpeas.core.node.model.NodePK; +import org.silverpeas.core.subscription.SubscriptionServiceProvider; +import org.silverpeas.core.subscription.service.NodeSubscriptionResource; +import org.silverpeas.core.subscription.util.SubscriptionSubscriberList; +import org.silverpeas.core.util.file.FileRepositoryManager; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +@SuppressWarnings("serial") +public class FileServlet extends AbstractSilverpeasMobileServlet { + + private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB + private static long MAX_FILE_SIZE = 1024 * 1024 * 100; // 100MB + private static long MAX_REQUEST_SIZE = 1024 * 1024 * 110; // 110MB + + @Override + public void init(final ServletConfig config) throws ServletException { + super.init(config); + MAX_FILE_SIZE = FileRepositoryManager.getUploadMaximumFileSize(); + MAX_REQUEST_SIZE = (long) (MAX_FILE_SIZE * 1.1); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + } + + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { + try { + checkUserInSession(request, response); + processRequest(request, response); + } catch (Exception e) { + e.printStackTrace(); + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + + + String componentId = ""; + String publicationId = ""; + String folderId = ""; + String tempDir = FileRepositoryManager.getTemporaryPath(); + + // configures upload settings + DiskFileItemFactory factory = new DiskFileItemFactory(); + // sets memory threshold - beyond which files are stored in disk + factory.setSizeThreshold(MEMORY_THRESHOLD); + // sets temporary location to store files + factory.setRepository(new File(tempDir)); + + ServletFileUpload upload = new ServletFileUpload(factory); + + // sets maximum size of upload file + upload.setFileSizeMax(MAX_FILE_SIZE); + + // sets maximum size of request (include file + form data) + upload.setSizeMax(MAX_REQUEST_SIZE); + + // Parse the request + @SuppressWarnings("unchecked") + List<FileItem> items = null; + try { + items = upload.parseRequest(request); + } catch(FileUploadBase.FileSizeLimitExceededException eu) { + response.sendError(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE); + return; + } catch (FileUploadException e) { + e.printStackTrace(); + } + + // Process the uploaded items + Iterator iter = items.iterator(); + while (iter.hasNext()) + { + FileItem item = (FileItem) iter.next(); + if (item.isFormField()) + { + if (item.getFieldName().equals("componentId")) componentId = item.getString(); + if (item.getFieldName().equals("folderId")) folderId = item.getString(); + if (item.getFieldName().equals("publicationId")) publicationId = item.getString(); + + } + else { + String fileName = item.getName(); + File file = new File(tempDir + File.separator + fileName); + try { + item.write(file); + if(folderId.isEmpty()) { + addFileToPublication(request, fileName, componentId, publicationId, file); + } else { + createPublication(request, fileName, componentId, folderId, file); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + private void addFileToPublication(HttpServletRequest request, String name, String componentId, String publicationId, + File file) throws Exception { + + PublicationPK pk = new PublicationPK(publicationId, componentId); + KmeliaService.get().addAttachmentToPublication(pk, getUserInSession(request).getId(), name, "", + FileUtils.readFileToByteArray(file)); + } + + private String createPublication(HttpServletRequest request, String name, + String componentId, String folderId, File file) throws Exception { + + PublicationDetail pub = PublicationDetail.builder().build(); + pub.setName(file.getName()); + PublicationPK pk = new PublicationPK("", componentId); + pub.setPk(pk); + pub.setCreatorId(getUserInSession(request).getId()); + + NodePK node = new NodePK(folderId); + node.setComponentName(componentId); + + String pubId = KmeliaService.get().createPublicationIntoTopic(pub, node); + pk.setId(pubId); + + KmeliaService.get().addAttachmentToPublication(pk, getUserInSession(request).getId(), name, "", FileUtils.readFileToByteArray(file)); + + + SubscriptionSubscriberList l = SubscriptionServiceProvider.getSubscribeService() + .getSubscribers(NodeSubscriptionResource.from(node)); + + + KmeliaService.get().getUserNotification(node).send(); + + return pubId; + } + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/MediaServlet.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/MediaServlet.java index eb924401f..bea510cf8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/MediaServlet.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/MediaServlet.java @@ -37,8 +37,11 @@ import org.silverpeas.components.gallery.model.Media; import org.silverpeas.components.gallery.model.MediaPK; import org.silverpeas.components.gallery.model.Photo; +import org.silverpeas.components.gallery.notification.user.GalleryUserAlertNotification; import org.silverpeas.components.gallery.service.GalleryService; import org.silverpeas.components.gallery.service.MediaServiceProvider; +import org.silverpeas.core.admin.user.model.User; +import org.silverpeas.core.node.model.NodePK; import org.silverpeas.core.util.file.FileRepositoryManager; import org.silverpeas.mobile.server.common.LocalDiskFileItem; import org.silverpeas.mobile.server.helpers.MediaHelper; @@ -202,6 +205,11 @@ private String createMedia(HttpServletRequest request, HttpServletResponse respo Media newMedia = getGalleryService().createMedia(getUserInSession(request), componentId, GalleryComponentSettings.getWatermark(componentId), delegate); + // notification management + User sender = getUserInSession(request); + GalleryUserAlertNotification n = new GalleryUserAlertNotification(new NodePK(albumId, componentId), newMedia, sender); + n.build().send(); + return newMedia.getId(); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java index 679c872d7..ca0f1bc16 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java @@ -115,19 +115,16 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re response.getOutputStream().print("<html>"); response.getOutputStream().print("<head>"); - response.getOutputStream() - .print("<meta http-equiv='content-type' content='text/html;charset=UTF-8' />"); - response.getOutputStream().print("<style>"); - - InputStream template = - getServletContext().getResourceAsStream("/spmobile/spmobile.css"); - response.getOutputStream().print(IOUtils.toString(template, StandardCharsets.UTF_8)); - response.getOutputStream().print("</style>"); + response.getOutputStream().print("<meta http-equiv='content-type' content='text/html;charset=UTF-8' />"); String urlCSS = mobileSettings.getString("styleSheet", ""); if (!urlCSS.isEmpty()) { response.getOutputStream().print("<link rel=\"stylesheet\" href=\"" + urlCSS + "\">"); } + String urlCSSWysiwyg = mobileSettings.getString("wysiwyg.styleSheet", ""); + if (!urlCSSWysiwyg.isEmpty()) { + response.getOutputStream().print("<link rel=\"stylesheet\" href=\"" + urlCSSWysiwyg + "\">"); + } response.getOutputStream().print("</head>"); response.getOutputStream().print("<body>"); @@ -185,6 +182,17 @@ private void displayWysiwyg(String html, HttpServletRequest request, HttpServlet } img.attr("src", newSource); } + Elements anchors = doc.getElementsByTag("a"); + for (Element a : anchors) { + String href = a.attr("href"); + String target = a.attr("target"); + if (!target.equalsIgnoreCase("_blank")) { + if (href.contains("/silverpeas/") && !href.contains(".jsp")) { + a.attr("href", "#"); + a.attr("onclick", "parent.navigate('" + href + "');"); + } + } + } html = doc.outerHtml(); OutputStreamWriter out = new OutputStreamWriter(response.getOutputStream(), "UTF-8"); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/WebAppOriginAssociationServlet.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/WebAppOriginAssociationServlet.java new file mode 100644 index 000000000..1e256f9fa --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/WebAppOriginAssociationServlet.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.server.servlets; + + +import org.apache.commons.io.IOUtils; +import org.silverpeas.core.util.StringUtil; +import org.silverpeas.core.util.logging.SilverLogger; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; + +/** + * @author: svu + */ +public class WebAppOriginAssociationServlet extends AbstractSilverpeasMobileServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + response.setContentType("application/json"); + response.setHeader("Cache-Control", "private, no-store, no-cache, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + + PrintWriter out = response.getWriter(); + + ServletContext context = getServletContext(); + String path = getSettings().getString("web-app-origin-association.json.path", ""); + InputStream template; + if (StringUtil.isDefined(path)) { + template = new FileInputStream(path); + } else { + template = + context.getResourceAsStream("/WEB-INF/web-app-origin-association.template"); + } + out.println(IOUtils.toString(template, StandardCharsets.UTF_8)); + } catch (Exception e) { + SilverLogger.getLogger(this).error(e); + } + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java index 63bb3288c..df729367e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java @@ -25,8 +25,8 @@ package org.silverpeas.mobile.shared.dto; import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; public class DetailUserDTO implements Serializable{ @@ -46,18 +46,20 @@ public class DetailUserDTO implements Serializable{ private String sessionKey; private boolean connected; private boolean notificationBox; - private LinkedHashMap<String, String> properties = new LinkedHashMap<String, String>(); + private boolean ldap; + private List<PropertyDTO> properties = new ArrayList<>(); public void addProperty(String key, String value) { - properties.put(key, value); + PropertyDTO dto = new PropertyDTO(); + dto.setKey(key); + dto.setValue(value); + this.properties.add(dto); } - - public Set<String> getProperties() { - return properties.keySet(); + public void setProperties(List<PropertyDTO> properties) { + this.properties = properties; } - - public String getPropertieValue(String key) { - return properties.get(key); + public List<PropertyDTO> getProperties() { + return properties; } public String getId() { @@ -175,4 +177,12 @@ public void setNotificationBox(final boolean notificationBox) { public boolean isNotificationBox() { return notificationBox; } + + public void setLdap(boolean ldap) { + this.ldap = ldap; + } + + public boolean isLdap() { + return ldap; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/GroupDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/GroupDTO.java index 73a976624..75d97496f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/GroupDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/GroupDTO.java @@ -33,7 +33,14 @@ public class GroupDTO extends BaseDTO implements Serializable{ private static final long serialVersionUID = 5388415881024885835L; private String name; + private int nbMembers; + public int getNbMembers() { + return nbMembers; + } + public void setNbMembers(int nbMembers) { + this.nbMembers = nbMembers; + } public String getName() { return name; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkCategoryDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkCategoryDTO.java new file mode 100644 index 000000000..5344b02a6 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkCategoryDTO.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.shared.dto; + +import java.io.Serializable; + +/** + * @author svu + */ +public class MyLinkCategoryDTO implements Serializable { + + private String catId; + + private String position; + private String name; + private String description; + + private String userId; + + public String getCatId() { + return catId; + } + + public void setCatId(String catId) { + this.catId = catId; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkDTO.java index ecc12c09a..382edf0f8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkDTO.java @@ -43,6 +43,8 @@ public class MyLinkDTO implements Serializable { private String instanceId = ""; private String objectId = ""; + private String categoryId = ""; + public String getUri() { return uri; } @@ -130,4 +132,12 @@ public String getObjectId() { public void setObjectId(final String objectId) { this.objectId = objectId; } + + public String getCategoryId() { + return categoryId; + } + + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java new file mode 100644 index 000000000..cea66b17f --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java @@ -0,0 +1,24 @@ +package org.silverpeas.mobile.shared.dto; + +import java.io.Serializable; + +public class PropertyDTO implements Serializable { + private String key; + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/almanach/CalendarEventCreationDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/almanach/CalendarEventCreationDTO.java new file mode 100644 index 000000000..bccb19874 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/almanach/CalendarEventCreationDTO.java @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.shared.dto.almanach; + +import org.silverpeas.mobile.shared.dto.reminder.ReminderDTO; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * @author svu + */ +public class CalendarEventCreationDTO implements Serializable { + + private String eventType; + private String occurrenceType; + private String startDate; + private String endDate; + private String eventId; + private CalendarDTO calendar; + private String title; + private boolean onAllDay; + private String visibility; + private String priority; + private String description; + private CalendarEventRecurrenceDTO recurrence; + + // "attributes": [{"name": "externalUrl"}], + // attachmentParameters": [] + private List<CalendarEventAttendeeDTO> attendees; + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public String getOccurrenceType() { + return occurrenceType; + } + + public void setOccurrenceType(String occurrenceType) { + this.occurrenceType = occurrenceType; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEventId() { + return eventId; + } + + public void setEventId(String eventId) { + this.eventId = eventId; + } + + public CalendarDTO getCalendar() { + return calendar; + } + + public void setCalendar(CalendarDTO calendar) { + this.calendar = calendar; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean getOnAllDay() { + return onAllDay; + } + + public void setOnAllDay(boolean onAllDay) { + this.onAllDay = onAllDay; + } + + public String getVisibility() { + return visibility; + } + + public void setVisibility(String visibility) { + this.visibility = visibility; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public CalendarEventRecurrenceDTO getRecurrence() { + return recurrence; + } + + public void setRecurrence(CalendarEventRecurrenceDTO recurrence) { + this.recurrence = recurrence; + } + + public List<CalendarEventAttendeeDTO> getAttendees() { + return attendees; + } + + public void setAttendees(List<CalendarEventAttendeeDTO> attendees) { + this.attendees = attendees; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java index b742b9643..59264111a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java @@ -98,16 +98,16 @@ public String getText() { public void setText(final String text) { this.text = text; + this.textForHtml = ""; } public String getTextForHtml() { + if (textForHtml.isEmpty()) { + textForHtml = text; + } return textForHtml; } - public void setTextForHtml(final String textForHtml) { - this.textForHtml = textForHtml; - } - public UserProfileDTO getAuthor() { return author; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/Config.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/Config.java index 97099e20f..1cf35b56a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/Config.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/Config.java @@ -38,6 +38,13 @@ public class Config { private boolean freeZoneDisplay; private boolean freeZoneThinDisplay; + private boolean standard; + private boolean grayscale; + private boolean sepia; + private boolean inverse; + + private int fontSize; + public Config() { } @@ -51,6 +58,11 @@ public static Config getDefaultConfig() { c.setShortCutsToolsDisplay(true); c.setFreeZoneDisplay(true); c.setFreeZoneThinDisplay(true); + c.setFontSize(10); + c.setStandard(true); + c.setGrayscale(false); + c.setSepia(false); + c.setInverse(false); return c; } @@ -118,6 +130,66 @@ public void setShortCutsToolsDisplay(final boolean shortCutsToolsDisplay) { this.shortCutsToolsDisplay = shortCutsToolsDisplay; } + public int getFontSize() { + return fontSize; + } + + public void setFontSize(int fontSize) { + this.fontSize = fontSize; + } + + public boolean isStandard() { + return standard; + } + + public void setStandard(boolean standard) { + this.standard = standard; + if (standard) { + setSepia(false); + setInverse(false); + setGrayscale(false); + } + } + + public boolean isGrayscale() { + return grayscale; + } + + public void setGrayscale(boolean grayscale) { + this.grayscale = grayscale; + if (grayscale) { + setStandard(false); + setSepia(false); + setInverse(false); + } + } + + public boolean isSepia() { + return sepia; + } + + public void setSepia(boolean sepia) { + this.sepia = sepia; + if (sepia) { + setStandard(false); + setInverse(false); + setGrayscale(false); + } + } + + public boolean isInverse() { + return inverse; + } + + public void setInverse(boolean inverse) { + this.inverse = inverse; + if (inverse) { + setStandard(false); + setSepia(false); + setGrayscale(false); + } + } + public AutoBean<IConfig> getAutoBean () { AutoBean<IConfig> b = LocalStorageHelper.factory.iconfig(); b.as().setFreeZoneDisplay(isFreeZoneDisplay()); @@ -128,6 +200,11 @@ public AutoBean<IConfig> getAutoBean () { b.as().setLastPublicationsDisplay(isLastPublicationsDisplay()); b.as().setShortCutsDisplay(isShortCutsDisplay()); b.as().setShortCutsToolsDisplay(isShortCutsToolsDisplay()); + b.as().setFontSize(getFontSize()); + b.as().setStandard(isStandard()); + b.as().setGrayscale(isGrayscale()); + b.as().setSepia(isSepia()); + b.as().setInverse(isInverse()); return b; } @@ -141,6 +218,11 @@ public static Config getBean (AutoBean<IConfig> b) { conf.setLastPublicationsDisplay(b.as().isLastPublicationsDisplay()); conf.setShortCutsDisplay(b.as().isShortCutsDisplay()); conf.setShortCutsToolsDisplay(b.as().isShortCutsToolsDisplay()); + conf.setFontSize(b.as().getFontSize()); + conf.setStandard(b.as().isStandard()); + conf.setGrayscale(b.as().isGrayscale()); + conf.setSepia(b.as().isSepia()); + conf.setInverse(b.as().isInverse()); return conf; } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/IConfig.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/IConfig.java index ab93b6c1a..e684e67e5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/IConfig.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/configuration/IConfig.java @@ -42,4 +42,23 @@ public interface IConfig { public void setShortCutsToolsDisplay(final boolean shortCutsToolsDisplay); + public int getFontSize(); + + public void setFontSize(int fontSize); + + boolean isStandard(); + + void setStandard(final boolean standard); + + void setGrayscale(final boolean grayscale); + + boolean isGrayscale(); + + void setSepia(final boolean sepia); + + boolean isSepia(); + + void setInverse(final boolean inverse); + + boolean isInverse(); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java index 7592f3829..b991141c0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java @@ -43,10 +43,16 @@ public class PublicationDTO extends BaseDTO implements Serializable, Comparable< private int commentsNumber = 0; private String instanceId; private boolean content; + + private boolean draft; + + private boolean publishable; private List<PublicationDTO> linkedPublications; private String vignette; private int viewsNumber; + private List<String> notAllowedDownloads; + public String getName() { return name; } @@ -136,4 +142,27 @@ public void setCreationDate(final String creationDate) { public int getViewsNumber() { return viewsNumber; } public void setViewsNumber(final int viewsNumber) { this.viewsNumber = viewsNumber; } + + public void setNotAllowedDownloads(List<String> notAllowedDownloads) { + this.notAllowedDownloads = notAllowedDownloads; + } + public List<String> getNotAllowedDownloads() { + return notAllowedDownloads; + } + + public boolean isDraft() { + return draft; + } + + public void setDraft(boolean draft) { + this.draft = draft; + } + + public boolean isPublishable() { + return publishable; + } + + public void setPublishable(boolean publishable) { + this.publishable = publishable; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java index cd2effcef..577524227 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java @@ -50,6 +50,8 @@ public class SimpleDocumentDTO implements Serializable { private String spId; + private boolean downloadable; + public String getId() { return id; @@ -194,4 +196,11 @@ public String getSpId() { public void setSpId(String spId) { this.spId = spId; } + + public void setDownloadable(boolean downloadable) { + this.downloadable = downloadable; + } + public boolean isDownloadable() { + return this.downloadable; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java new file mode 100644 index 000000000..7a928e6b2 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.shared.dto.hyperlink; + +import org.silverpeas.mobile.shared.dto.BaseDTO; + +import java.io.Serializable; + +public class HyperLinkDTO implements Serializable { + + private String url; + private boolean openNewWindow; + private boolean internalLink; + + public HyperLinkDTO() { + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public boolean getOpenNewWindow() { + return openNewWindow; + } + + public void setOpenNewWindow(boolean openNewWindow) { + this.openNewWindow = openNewWindow; + } + + public boolean getInternalLink() { + return internalLink; + } + + public void setInternalLink(boolean internalLink) { + this.internalLink = internalLink; + } +} \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/navigation/ApplicationInstanceDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/navigation/ApplicationInstanceDTO.java index 49d1d5df7..94a8f302e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/navigation/ApplicationInstanceDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/navigation/ApplicationInstanceDTO.java @@ -42,6 +42,8 @@ public class ApplicationInstanceDTO extends SilverpeasObjectDTO implements Seria private int publicationSharing; private int fileSharing; + private boolean personnal; + public String getType() { return type; } @@ -105,4 +107,11 @@ public void setExtraId(final String extraId) { public int getPublicationSharing() { return publicationSharing; } public int getFileSharing() { return fileSharing; } + public boolean getPersonnal() { + return personnal; + } + + public void setPersonnal(boolean personnal) { + this.personnal = personnal; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationBoxDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationBoxDTO.java index d7529eb6e..39d6634b6 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationBoxDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationBoxDTO.java @@ -34,6 +34,7 @@ public class NotificationBoxDTO implements Serializable { private long idNotif; + private boolean sended; public long getIdNotif() { return idNotif; @@ -42,4 +43,12 @@ public long getIdNotif() { public void setIdNotif(final long idNotif) { this.idNotif = idNotif; } + + public boolean isSended() { + return sended; + } + + protected void setSended(boolean sended) { + this.sended = sended; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationDTO.java index 12dbc2410..844f129ec 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationDTO.java @@ -34,6 +34,8 @@ public class NotificationDTO implements Serializable { public final static String TYPE_PUBLICATION = "Publication"; + + public final static String TYPE_DOCUMENT = "Document"; public final static String TYPE_PHOTO = "Photo"; public final static String TYPE_VIDEO = "Video"; public final static String TYPE_SOUND = "Sound"; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationReceivedDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationReceivedDTO.java index feff5f1c7..e71e179b9 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationReceivedDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationReceivedDTO.java @@ -42,6 +42,7 @@ public class NotificationReceivedDTO extends NotificationBoxDTO implements Seria public NotificationReceivedDTO() { super(); + setSended(false); } public String getDate() { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationSendedDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationSendedDTO.java index a393444f3..aeabdb25a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationSendedDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/notifications/NotificationSendedDTO.java @@ -40,6 +40,7 @@ public class NotificationSendedDTO extends NotificationBoxDTO implements Seriali public NotificationSendedDTO() { super(); + setSended(true); } public String getDate() { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/helpers/ApplicationsHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/helpers/ApplicationsHelper.java new file mode 100644 index 000000000..f1cdfb6ea --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/helpers/ApplicationsHelper.java @@ -0,0 +1,18 @@ +package org.silverpeas.mobile.shared.helpers; + +import com.google.gwt.user.client.Window; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; +import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; + +public class ApplicationsHelper { + + public static boolean isSupportedApp(ApplicationInstanceDTO app) { + String appSupported = ResourcesManager.getParam("apps.supported"); + String apps[] = appSupported.split(","); + for (String ap : apps) { + if (app.getType().equalsIgnoreCase(ap.trim())) return true; + } + return false; + } + +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceAlmanach.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceAlmanach.java index 79a82b79f..d63aa879c 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceAlmanach.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceAlmanach.java @@ -28,13 +28,11 @@ import org.fusesource.restygwt.client.RestService; import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventAttendeeDTO; +import org.silverpeas.mobile.shared.dto.almanach.CalendarEventCreationDTO; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import java.util.List; /** @@ -72,4 +70,10 @@ public void updateParticipation(@PathParam("componentInstanceId") String compone @QueryParam("zoneid") String zoneid, CalendarEventAttendeeDTO dto, MethodCallback<CalendarEventDTO> callback); + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("{componentInstanceId}/{calendarId}/events") + public void createEvent(@PathParam("componentInstanceId") String componentInstanceId, + @PathParam("calendarId") String calendarId, CalendarEventCreationDTO event, MethodCallback<CalendarEventDTO> callback); + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceDocuments.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceDocuments.java index 607357ea9..743df139e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceDocuments.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceDocuments.java @@ -82,4 +82,16 @@ public void getTickets(@PathParam("appId") String appId, List<TicketDTO> tickets public void deleteTickets(@PathParam("appId") String appId, List<TicketDTO> tickets, MethodCallback<List<TicketDTO>> callback); + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("{appId}/nextpublication/{id}/{direction}") + public void getNextPublication(@PathParam("appId") String appId, + @PathParam("id") String id, + @PathParam("direction") String direction, MethodCallback<PublicationDTO> callback); + + @POST + @Produces(MediaType.APPLICATION_JSON) + @Path("{appId}/publish/{pubId}") + public void publish(@PathParam("appId") String appId, @PathParam("pubId") String pubId, MethodCallback<PublicationDTO> callback); + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java index e08837d6d..1000c1ada 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java @@ -24,8 +24,9 @@ package org.silverpeas.mobile.shared.services.rest; +import org.fusesource.restygwt.client.MethodCallback; import org.fusesource.restygwt.client.RestService; -import org.fusesource.restygwt.client.TextCallback; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -39,5 +40,5 @@ public interface ServiceHyperLink extends RestService { @GET @Path("{appId}/") - public void getUrl(@PathParam("appId") String appId, TextCallback callback); + public void getUrl(@PathParam("appId") String appId, MethodCallback<HyperLinkDTO> callback); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java index 0d2674a6d..1e8fce900 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java @@ -48,26 +48,14 @@ @Path("/mobile/medialib") public interface ServiceMedia extends RestService { - @GET - @Path("{appId}/question/all") - public void getAllQuestions(@PathParam("appId") String appId, - MethodCallback<List<QuestionDTO>> callback); - - - @GET @Path("add/{name}/{data}/{idGallery}/{idAlbum}") public void uploadPicture(@PathParam("name") String name, @PathParam("data") String data, @PathParam("idGallery") String idGallery, @PathParam("idAlbum") String idAlbum, MethodCallback<Void> callback); @GET @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Path("allGalleries") - public void getAllGalleries(MethodCallback<List<ApplicationInstanceDTO>> callback); - - @GET - @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Path("media/{id}") - public void getMedia(@PathParam("id") String id, MethodCallback<MediaDTO> callback); + @Path("{appId}/media/{id}") + public void getMedia(@PathParam("appId") String instanceId, @PathParam("id") String id, MethodCallback<MediaDTO> callback); @GET @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) @@ -92,6 +80,6 @@ public void getAllQuestions(@PathParam("appId") String appId, @GET @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Path("{appId}/videostream/{pictureId}") + @Path("{appId}/photo/{pictureId}") public void getPreviewPicture(@PathParam("appId") String instanceId, @PathParam("pictureId") String pictureId, MethodCallback<PhotoDTO> callback); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMyLinks.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMyLinks.java index 67579cf80..244277c31 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMyLinks.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMyLinks.java @@ -26,13 +26,12 @@ import org.fusesource.restygwt.client.MethodCallback; import org.fusesource.restygwt.client.RestService; +import org.silverpeas.mobile.shared.dto.MyLinkCategoryDTO; import org.silverpeas.mobile.shared.dto.MyLinkDTO; import org.silverpeas.mobile.shared.dto.comments.CommentDTO; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import java.util.List; /** @@ -50,4 +49,13 @@ public interface ServiceMyLinks extends RestService { @Path("/") public void getMyLinks(MethodCallback<List<MyLinkDTO>> callback); + @DELETE + @Path("{linkId}") + public void deleteLink(final @PathParam("linkId") String linkId, MethodCallback<Void> callback); + + @GET + @Path("categories") + @Produces(MediaType.APPLICATION_JSON) + public void getMyCategories(MethodCallback<List<MyLinkCategoryDTO>> callback); + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java index 02a98c7b7..b216b9059 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java @@ -31,6 +31,7 @@ import org.silverpeas.mobile.shared.dto.HomePageDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.SilverpeasObjectDTO; +import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -48,6 +49,16 @@ @Path("/mobile/navigation") public interface ServiceNavigation extends RestService { + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("space/{spaceId}/") + public void getSpace(@PathParam("spaceId") String spaceId, MethodCallback<SpaceDTO> callback); + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("personalSpace/{userId}/") + public void getPersonnalSpaceContent(@PathParam("userId") String userId, MethodCallback<List<ApplicationInstanceDTO>> callback); + @GET @Produces(MediaType.APPLICATION_JSON) @Path("spacesAndApps/{rootSpaceId}/") @@ -77,8 +88,8 @@ public void getApp(@PathParam("instanceId") String instanceId, @GET @Produces(MediaType.APPLICATION_JSON) - @Path("homepage/{spaceId}/") - public void getHomePageData(@PathParam("spaceId") String spaceId, MethodCallback<HomePageDTO> callback); + @Path("homepage/{spaceId}/{zoom}/") + public void getHomePageData(@PathParam("spaceId") String spaceId, @PathParam("zoom") String zoom, MethodCallback<HomePageDTO> callback); @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceTask.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceTask.java index 2cfffd1bd..97840bb83 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceTask.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceTask.java @@ -28,12 +28,7 @@ import org.fusesource.restygwt.client.RestService; import org.silverpeas.mobile.shared.dto.TaskDTO; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; +import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import java.util.List; @@ -55,6 +50,12 @@ public interface ServiceTask extends RestService { @Path("") public void updateTask(TaskDTO task, MethodCallback<Void> callback); + @DELETE + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @Path("") + public void deleteTasks(List<TaskDTO> tasks, MethodCallback<Void> callback); + @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) diff --git a/mobile-war/src/main/webapp/WEB-INF/app-init.template b/mobile-war/src/main/webapp/WEB-INF/app-init.template index 0e834d3e6..86250f507 100644 --- a/mobile-war/src/main/webapp/WEB-INF/app-init.template +++ b/mobile-war/src/main/webapp/WEB-INF/app-init.template @@ -5,28 +5,31 @@ if (firebaseConfig != null) { const messaging = firebase.messaging(); navigator.serviceWorker.register('/silverpeas/spmobile/app-sw.js') .then((registration) => { - messaging.useServiceWorker(registration); + navigator.serviceWorker.ready.then(function(reg) { + messaging.useServiceWorker(registration); - // Request permission and get token..... - Notification.requestPermission().then(function(permission) { - if (permission === "granted") { - messaging.getToken().then(token => { - console.log("Token Is : " + token); - storeToken(token); + // Request permission and get token..... + Notification.requestPermission().then(function(permission) { + if (permission === "granted") { + messaging.getToken().then(token => { + console.log("Token Is : " + token); + storeToken(token); + }); + } else { + console.log("No permission to send push"); + } }); - } else { - console.log("No permission to send push"); - } }); }); messaging.onMessage(payload => { const notificationOptions = { - body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png' + body : payload.data["body"], icon : '/silverpeas/util/icons/desktop-user-notification.png', + data : payload.data }; navigator.serviceWorker.getRegistration('/silverpeas/spmobile/').then(registration => { - registration.showNotification(payload.data["sender"], notificationOptions) + registration.showNotification(payload.data["subject"], notificationOptions) }); }); } else { diff --git a/mobile-war/src/main/webapp/WEB-INF/app-sw.template b/mobile-war/src/main/webapp/WEB-INF/app-sw.template index ed7735cf4..a379890f3 100644 --- a/mobile-war/src/main/webapp/WEB-INF/app-sw.template +++ b/mobile-war/src/main/webapp/WEB-INF/app-sw.template @@ -10,9 +10,9 @@ if (firebaseConfig != null) { messaging.setBackgroundMessageHandler(function(payload) { console.log('[firebase-messaging-sw.js] Received background message ', payload); - const notificationTitle = payload.data["sender"]; + const notificationTitle = payload.data["subject"]; const notificationOptions = { - body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png', + body : payload.data["body"], icon : '/silverpeas/util/icons/desktop-user-notification.png', data : payload.data }; @@ -24,7 +24,33 @@ if (firebaseConfig != null) { const pushData = event.notification.data; event.notification.close(); if (!pushData["permalink"].endsWith("/null")) { - event.waitUntil(self.clients.openWindow(pushData["permalink"])); + fetch('/silverpeas/services/mobile/notification/readed/' + pushData["notificationId"], { + method: 'PUT' + }); + + event.waitUntil(clients.matchAll({type: "window", includeUncontrolled: true}).then(function (clientList) { + if (pushData["permalink"]) { + let client = null; + for (let i = 0; i < clientList.length; i++) { + let item = clientList[i]; + if (item.url) { + client = item; + break; + } + } + if (client && 'navigate' in client) { + client.focus(); + event.notification.close(); + return client.navigate(pushData["permalink"]); + } + else { + event.notification.close(); + // if client doesn't have navigate function, try to open a new browser window + return clients.openWindow(pushData["permalink"]); + } + } + })); + } }); diff --git a/mobile-war/src/main/webapp/WEB-INF/manifest.json.template b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template index 64fdf79e0..6abde7196 100644 --- a/mobile-war/src/main/webapp/WEB-INF/manifest.json.template +++ b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template @@ -1,18 +1,32 @@ { "name": "Silverpeas Mobile", "short_name": "SpMobile", - "background_color": "white", + "id": "spmobile", + "background_color": "#FFFFFF", "description": "Version mobile de Silverpeas", "orientation": "portrait-primary", "scope": "/silverpeas/spmobile/", "start_url": "/silverpeas/spmobile/spmobil.jsp", "display": "standalone", - "theme_color": "green", + "display_override": ["standalone", "minimal-ui"], + "theme_color": "#7eb73b", "icons": [ { "src" : "icon.png", "type" : "image/png", "sizes" : "144x144" + }, + { + "src" : "iconh.png", + "type" : "image/png", + "sizes" : "512x512" } - ] + ], + + "capture_links": "existing_client_event", + "url_handlers" : [ + { + "origin": "https://intranoo.silverpeas.com" + } + ] } \ No newline at end of file diff --git a/mobile-war/src/main/webapp/WEB-INF/web-app-origin-association.template b/mobile-war/src/main/webapp/WEB-INF/web-app-origin-association.template new file mode 100644 index 000000000..f08be9f99 --- /dev/null +++ b/mobile-war/src/main/webapp/WEB-INF/web-app-origin-association.template @@ -0,0 +1,11 @@ +{ + "web_apps": [ + { + "manifest": "https://intranoo.silverpeas.com/silverpeas/spmobile/manifest.json", + "details": { + "paths": ["/*"], + "exclude_paths": [] + } + } + ] +} \ No newline at end of file diff --git a/mobile-war/src/main/webapp/WEB-INF/web.xml b/mobile-war/src/main/webapp/WEB-INF/web.xml index 541ab30ab..83b98d3a0 100644 --- a/mobile-war/src/main/webapp/WEB-INF/web.xml +++ b/mobile-war/src/main/webapp/WEB-INF/web.xml @@ -71,6 +71,16 @@ <servlet-class>org.silverpeas.mobile.server.servlets.PublicationContentServlet</servlet-class> </servlet> + <servlet-mapping> + <servlet-name>webAppOriginAssociationServlet</servlet-name> + <url-pattern>/spmobile/web-app-origin-association</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>webAppOriginAssociationServlet</servlet-name> + <servlet-class>org.silverpeas.mobile.server.servlets.WebAppOriginAssociationServlet</servlet-class> + </servlet> + <servlet-mapping> <servlet-name>PublicationContentServlet</servlet-name> <url-pattern>/services/spmobile/PublicationContent</url-pattern> @@ -86,6 +96,16 @@ <url-pattern>/services/spmobile/MediaAction</url-pattern> </servlet-mapping> + <servlet> + <servlet-name>FileServlet</servlet-name> + <servlet-class>org.silverpeas.mobile.server.servlets.FileServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>FileServlet</servlet-name> + <url-pattern>/services/spmobile/FileAction</url-pattern> + </servlet-mapping> + <servlet> <servlet-name>FormServlet</servlet-name> <servlet-class>org.silverpeas.mobile.server.servlets.FormServlet</servlet-class> diff --git a/mobile-war/src/main/webapp/spmobile/iconh.png b/mobile-war/src/main/webapp/spmobile/iconh.png new file mode 100644 index 000000000..3d65a520a Binary files /dev/null and b/mobile-war/src/main/webapp/spmobile/iconh.png differ diff --git a/mobile-war/src/main/webapp/spmobile/spmobil.jsp b/mobile-war/src/main/webapp/spmobile/spmobil.jsp index 4ef5e0867..6b10c3b1c 100644 --- a/mobile-war/src/main/webapp/spmobile/spmobil.jsp +++ b/mobile-war/src/main/webapp/spmobile/spmobil.jsp @@ -49,6 +49,7 @@ <meta name="apple-mobile-web-app-capable" content="yes"/> <meta name="apple-mobile-web-app-status-bar-style" content="default"/> <link rel="manifest" href="manifest.json"> + <link rel="web-app-origin-association" href="web-app-origin-association"> <% String l = request.getHeader("Accept-Language"); @@ -144,6 +145,9 @@ var windowHeight = window.innerHeight; document.body.style.height = windowHeight + "px"; } + function navigate(url) { + window.navigateTo(url); + } </script> <% @@ -157,9 +161,12 @@ </head> <body class="ui-panel-wrapper ui-page-theme-a csspinner traditional" onload="resize();"> <% - String fullSsoPath = request.getRequestURL().toString(); - fullSsoPath = fullSsoPath.replace("/spmobile/spmobil.jsp",""); - fullSsoPath = fullSsoPath + ssoPath; + String fullSsoPath = ""; + if (!ssoPath.trim().isEmpty()) { + fullSsoPath = request.getRequestURL().toString(); + fullSsoPath = fullSsoPath.replace("/spmobile/spmobil.jsp", ""); + fullSsoPath = fullSsoPath + ssoPath; + } %> <input type="hidden" id="ssoPath" value="<%=fullSsoPath%>"> <div id="oneinch" diff --git a/pom.xml b/pom.xml index 6f142784e..0f2426fda 100644 --- a/pom.xml +++ b/pom.xml @@ -35,14 +35,14 @@ <groupId>org.silverpeas.components</groupId> <artifactId>mobile</artifactId> <packaging>pom</packaging> - <version>6.4-SNAPSHOT</version> + <version>6.4-JR-SNAPSHOT</version> <name>Silverpeas Mobile component</name> <properties> - <silverpeas.version>6.4-build230430</silverpeas.version> + <silverpeas.version>6.4-JR-build240107</silverpeas.version> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> - <next.release>6.4</next.release> + <next.release>6.4-JR</next.release> </properties> <repositories>