From d58ab405326d6e42de69429b7c4c3265df105b75 Mon Sep 17 00:00:00 2001
From: SilverYoCha <yohann.chastagnier@silverpeas.com>
Date: Tue, 2 May 2023 19:38:07 +0200
Subject: [PATCH 001/228] The jackrabbit development branch is set to
 6.4-JR-SNAPSHOT.

---
 mobile-configuration/pom.xml | 2 +-
 mobile-war/pom.xml           | 2 +-
 pom.xml                      | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/mobile-configuration/pom.xml b/mobile-configuration/pom.xml
index 839a4a162..6134753ed 100644
--- a/mobile-configuration/pom.xml
+++ b/mobile-configuration/pom.xml
@@ -28,7 +28,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>
diff --git a/mobile-war/pom.xml b/mobile-war/pom.xml
index c03b6410b..f5e088b3b 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>
diff --git a/pom.xml b/pom.xml
index 6f142784e..468480383 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,7 +35,7 @@
   <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>

From 97a72309d4531b0da1312057197f4490d5cf916c Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Fri, 5 May 2023 14:34:25 +0200
Subject: [PATCH 002/228] Update dependency on Silverpeas to version
 6.4-JR-build230505

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 468480383..6d3fa2c44 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-build230430</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230505</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4</next.release>

From 53f85b047cbef03c90b1e3541c06cf0bd9f3c6b3 Mon Sep 17 00:00:00 2001
From: Miguel Moquillon <miguel.moquillon@silverpeas.com>
Date: Fri, 5 May 2023 14:52:05 +0200
Subject: [PATCH 003/228] Fix the property next.release in pom.xml

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 6d3fa2c44..904fbd88c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,7 +42,7 @@
     <silverpeas.version>6.4-JR-build230505</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>

From 85af527cfb5b8b6bb43cfc3c3c422619e0438ef0 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 7 May 2023 23:24:06 +0200
Subject: [PATCH 004/228] Update dependency on Silverpeas to version
 6.4-JR-build230507

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 904fbd88c..9218b3d14 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230505</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230507</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 374ac0f154b0186c2a399be25b3bc4c1e6f22cf4 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 15 May 2023 16:01:47 +0200
Subject: [PATCH 005/228] Feature #13590

---
 .../src/main/webapp/WEB-INF/manifest.json.template       | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

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..728e6efab 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,23 @@
 {
   "name": "Silverpeas Mobile",
   "short_name": "SpMobile",
-  "background_color": "white",
+  "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",
+  "theme_color": "#00FF00",
   "icons": [
     {
       "src" : "icon.png",
       "type" : "image/png",
       "sizes" : "144x144"
     }
+    {
+      "src" : "iconh.png",
+      "type" : "image/png",
+      "sizes" : "512x512"
+    }
   ]
 }
\ No newline at end of file

From 454f8a3720c46a34b6cd682b212658cb9e77c75a Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 16 May 2023 14:26:10 +0200
Subject: [PATCH 006/228] Feature #13590

---
 mobile-war/src/main/webapp/spmobile/iconh.png | Bin 0 -> 70443 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 mobile-war/src/main/webapp/spmobile/iconh.png

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 0000000000000000000000000000000000000000..3d65a520a6dff3725248b31e37b04853b5256d0a
GIT binary patch
literal 70443
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

literal 0
HcmV?d00001


From 1b89528fb013bdcf34479a52de834c58dcf08ac1 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 16 May 2023 14:37:59 +0200
Subject: [PATCH 007/228] Feature #13590

---
 mobile-war/src/main/webapp/WEB-INF/manifest.json.template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 728e6efab..66f37f344 100644
--- a/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
+++ b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
@@ -13,7 +13,7 @@
       "src" : "icon.png",
       "type" : "image/png",
       "sizes" : "144x144"
-    }
+    },
     {
       "src" : "iconh.png",
       "type" : "image/png",

From 0b227fac76993dcb8889e8584ac1fe5590d11200 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 22 May 2023 10:51:11 +0200
Subject: [PATCH 008/228] Update dependency on Silverpeas to version
 6.4-JR-build230522

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 9218b3d14..bf68ab30f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230507</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230522</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From e270e4e093f688c8bd85312579b9a698233ea59e Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 24 May 2023 23:36:06 +0200
Subject: [PATCH 009/228] Update dependency on Silverpeas to version
 6.4-JR-build230524

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index bf68ab30f..03c02ccb0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230522</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230524</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From d75314c08a429796819bffb618cf48978f075792 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Tue, 30 May 2023 18:04:20 +0200
Subject: [PATCH 010/228] Update dependency on Silverpeas to version
 6.4-JR-build230530

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 03c02ccb0..6bade2691 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230524</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230530</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From b080b847a20cc3b7bf48650065b6806ef632c54c Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 31 May 2023 23:34:38 +0200
Subject: [PATCH 011/228] Update dependency on Silverpeas to version
 6.4-JR-build230531

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 6bade2691..cd16e3741 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230530</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230531</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From d8d4347f5834797b7aaaa01e453db3f7556dd8f1 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 4 Jun 2023 23:34:37 +0200
Subject: [PATCH 012/228] Update dependency on Silverpeas to version
 6.4-JR-build230604

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index cd16e3741..423b63779 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230531</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230604</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 2335692d8f9c916a48e5c4b4077e1b03faa9da2a Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Fri, 9 Jun 2023 19:30:25 +0200
Subject: [PATCH 013/228] Update dependency on Silverpeas to version
 6.4-JR-build230609

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 423b63779..1feece30b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230604</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230609</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 80bc9105aa3e142e56381077058b03d01c9df9aa Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 11 Jun 2023 23:34:37 +0200
Subject: [PATCH 014/228] Update dependency on Silverpeas to version
 6.4-JR-build230611

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 1feece30b..7f2583baf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230609</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230611</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 8743a9cde73392f5daa26896ba124b07941b3343 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 14 Jun 2023 23:37:37 +0200
Subject: [PATCH 015/228] Update dependency on Silverpeas to version
 6.4-JR-build230614

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 7f2583baf..efa7b01df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230611</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230614</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From cbb261359f1ca985aefc203f213ba8da9fff39d6 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 19 Jun 2023 13:06:33 +0200
Subject: [PATCH 016/228] Update dependency on Silverpeas to version
 6.4-JR-build230619

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index efa7b01df..ef8b0dd41 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230614</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230619</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 1da0f23fbe1e164df7ff09c8d0c2bdb49435c58d Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Tue, 20 Jun 2023 20:37:58 +0200
Subject: [PATCH 017/228] Update dependency on Silverpeas to version
 6.4-JR-build230620

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index ef8b0dd41..e6646df5a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230619</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230620</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 2c6ed06cee0f2f0726183f6df20103afc86efe63 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Fri, 23 Jun 2023 17:29:45 +0200
Subject: [PATCH 018/228] Update dependency on Silverpeas to version
 6.4-JR-build230623

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index e6646df5a..fdc04e417 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230620</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230623</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From d3f01c54962ea542e4bbe0c92aca139b3d66cf22 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 26 Jun 2023 18:28:25 +0200
Subject: [PATCH 019/228] Update dependency on Silverpeas to version
 6.4-JR-build230626

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index fdc04e417..133fffaee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230623</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230626</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 58e384fb739c0fcd70430132e2a1436fa507350a Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Tue, 27 Jun 2023 15:30:58 +0200
Subject: [PATCH 020/228] Update dependency on Silverpeas to version
 6.4-JR-build230627

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 133fffaee..2b756d326 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230626</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230627</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From cbe00f3c0533250b9367541021ba08c0ff6495b7 Mon Sep 17 00:00:00 2001
From: SilverYoCha <yohann.chastagnier@silverpeas.com>
Date: Wed, 28 Jun 2023 15:47:49 +0200
Subject: [PATCH 021/228] MobilFilter is exposed on all Silverpeas's HTTP
 requests. But in some cases, the HTTP requests performed MUST not induice the
 creation of an HTTP session (and so a JSESSIONID). That is why the filter has
 evolved in order to avoid creating an HTTP session when it is not necessary.

---
 .../org/silverpeas/bridge/MobilFilter.java    |  54 ++++----
 .../silverpeas/bridge/SafeSessionManager.java | 121 ++++++++++++++++++
 2 files changed, 145 insertions(+), 30 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/bridge/SafeSessionManager.java

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..dd9af6aeb 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -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,31 +71,35 @@ 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);
 
@@ -187,10 +190,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 +202,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;
+    }
+  }
+}

From 5d9f021c431359b7660e498dc3d247cecfd42bb8 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Thu, 29 Jun 2023 17:33:41 +0200
Subject: [PATCH 022/228] Update dependency on Silverpeas to version
 6.4-JR-build230629

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 2b756d326..b6e2f8348 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230627</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230629</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From cfbcebc74bf35e5f73c528684e97f570f449a01e Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 2 Jul 2023 23:31:01 +0200
Subject: [PATCH 023/228] Update dependency on Silverpeas to version
 6.4-JR-build230702

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index b6e2f8348..88d951512 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230629</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230702</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From d26eb74b4717482f1427bc704b66d322be91a52c Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 3 Jul 2023 20:03:59 +0200
Subject: [PATCH 024/228] Update dependency on Silverpeas to version
 6.4-JR-build230703

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 88d951512..c877916d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230702</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230703</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 3089dbcc8eeee35d7ad9998700cb461f55a41acb Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Thu, 6 Jul 2023 19:43:50 +0200
Subject: [PATCH 025/228] Update dependency on Silverpeas to version
 6.4-JR-build230706

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index c877916d6..f704407a3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230703</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230706</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 1ed90f101667d6923bd5b321891a04554c6107bf Mon Sep 17 00:00:00 2001
From: SilverYoCha <yohann.chastagnier@silverpeas.com>
Date: Fri, 7 Jul 2023 18:18:21 +0200
Subject: [PATCH 026/228] Bug #13605: fixing the comments that were not
 rendered

---
 .../mobile/client/apps/comments/CommentsApp.java          | 1 -
 .../silverpeas/mobile/shared/dto/comments/CommentDTO.java | 8 ++++----
 2 files changed, 4 insertions(+), 5 deletions(-)

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/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;
   }

From 50dbbf757c43bb16a201272ae7e2acc61e8cc6b8 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 9 Jul 2023 23:30:05 +0200
Subject: [PATCH 027/228] Update dependency on Silverpeas to version
 6.4-JR-build230709

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index f704407a3..1482c36a2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230706</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230709</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 8bd69781a9f189f67221b84f96d3d391febf2143 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 16 Jul 2023 23:31:00 +0200
Subject: [PATCH 028/228] Update dependency on Silverpeas to version
 6.4-JR-build230716

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 1482c36a2..9035f7d14 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230709</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230716</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From e079e111302648a5ece4d53824bcafef1c3571bf Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Thu, 20 Jul 2023 20:03:47 +0200
Subject: [PATCH 029/228] Update dependency on Silverpeas to version
 6.4-JR-build230720

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 9035f7d14..e368d1ee9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230716</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230720</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From c144b18fc165e06900c07722acfcc99cf8aa20c1 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 24 Jul 2023 17:05:41 +0200
Subject: [PATCH 030/228] Update dependency on Silverpeas to version
 6.4-JR-build230724

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index e368d1ee9..87a400154 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230720</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230724</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 626e8531d5e5c253c3e8a09212ff233b66f6d161 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 26 Jul 2023 23:28:49 +0200
Subject: [PATCH 031/228] Update dependency on Silverpeas to version
 6.4-JR-build230726

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 87a400154..040955363 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230724</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230726</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 749a51317f67f35b348a0f6ba98b0d68469aab9e Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 30 Jul 2023 23:28:33 +0200
Subject: [PATCH 032/228] Update dependency on Silverpeas to version
 6.4-JR-build230730

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 040955363..ebc096ced 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230726</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230730</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From b233f18878211e6390ea5d992329d3b505859c30 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 2 Aug 2023 23:29:48 +0200
Subject: [PATCH 033/228] Update dependency on Silverpeas to version
 6.4-JR-build230802

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index ebc096ced..5b484328f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230730</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230802</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From ccd192238c8c1ff43e0f762cb23a35867211dc25 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 3 Aug 2023 09:44:18 +0200
Subject: [PATCH 034/228] Feature #13676

---
 .../shared/dto/hyperlink/HyperLinkDTO.java    | 115 ++++++++++++++++++
 1 file changed, 115 insertions(+)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java

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..1477b9232
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java
@@ -0,0 +1,115 @@
+/*
+ * 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 extends BaseDTO implements Serializable {
+
+  private static final long serialVersionUID = 2921606984249560882L;
+
+  private String title;
+  private String description;
+  private String categoryId;
+  private String categoryName;
+  private String creatorName;
+  private String dateEvent;
+  private String creationDate;
+  private String instanceId;
+
+  public HyperLinkDTO() {
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    return ((HyperLinkDTO) obj).getId().equals(getId());
+  }
+
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(final String title) {
+    this.title = title;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(final String description) {
+    this.description = description;
+  }
+
+  public void setCategoryId(final String categoryId) {
+    this.categoryId = categoryId;
+  }
+
+  public void setCategoryName(final String categoryName) {
+    this.categoryName = categoryName;
+  }
+
+  public String getCategoryId() {
+    return categoryId;
+  }
+
+  public String getCategoryName() {
+    return categoryName;
+  }
+
+  public void setCreatorName(final String creatorName) {
+    this.creatorName = creatorName;
+  }
+
+  public String getCreatorName() {
+    return creatorName;
+  }
+
+  public void setDateEvent(final String dateEvent) {
+    this.dateEvent = dateEvent;
+  }
+
+  public void setCreationDate(final String creationDate) {
+    this.creationDate = creationDate;
+  }
+
+  public String getDateEvent() {
+    return dateEvent;
+  }
+
+  public String getCreationDate() {
+    return creationDate;
+  }
+
+  public String getInstanceId() {
+    return instanceId;
+  }
+
+  public void setInstanceId(final String instanceId) {
+    this.instanceId = instanceId;
+  }
+}

From e2ad7a22113ae2a7431159213a0f42d919458816 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 3 Aug 2023 11:45:47 +0200
Subject: [PATCH 035/228] Feature #13676

---
 .../client/apps/hyperlink/HyperLinkApp.java   | 10 ++-
 .../pages/widgets/FavoriteItem.java           |  7 +-
 .../pages/widgets/ShortCutItem.java           |  7 +-
 .../common/navigation/LinksManager.java       | 41 ++++++---
 .../mobile/client/components/IframePage.java  |  3 +-
 .../server/services/ServiceHyperLink.java     | 15 ++--
 .../shared/dto/hyperlink/HyperLinkDTO.java    | 86 ++++---------------
 .../services/rest/ServiceHyperLink.java       |  5 +-
 8 files changed, 77 insertions(+), 97 deletions(-)

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/navigation/pages/widgets/FavoriteItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java
index 098d63234..270482ac5 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
@@ -35,6 +35,7 @@
 import org.silverpeas.mobile.client.common.navigation.LinksManager;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 import org.silverpeas.mobile.shared.dto.MyLinkDTO;
+import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 
 public class FavoriteItem extends Composite {
 
@@ -68,7 +69,9 @@ public void setData(MyLinkDTO data) {
 
   @UiHandler("link")
   protected void onClick(ClickEvent event) {
-    LinksManager.processLink(data.getUrl());
+    HyperLinkDTO link = new HyperLinkDTO();
+    link.setUrl(data.getUrl());
+    LinksManager.processLink(link);
   }
 
-}
+}
\ 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/common/navigation/LinksManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java
index 6de2ed037..9c8bcafcb 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,7 +44,8 @@ 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 processLink(HyperLinkDTO hyperLinkDTO) {
+    String url = hyperLinkDTO.getUrl();
     if(sameContext(url)) {
       String shortcutContentType = "";
       String shortcutAppId = null;
@@ -91,15 +93,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, null);
       return;
     }
-    openExternalLink(url);
+    openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink());
   }
 
   private static boolean sameContext(String url) {
@@ -113,19 +115,34 @@ 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);
+    }
+  }
+
+  private 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", "");
+      }
     }
   }
 
-}
+}
\ No newline at end of file
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/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/shared/dto/hyperlink/HyperLinkDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java
index 1477b9232..7a928e6b2 100644
--- 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
@@ -28,88 +28,36 @@
 
 import java.io.Serializable;
 
-public class HyperLinkDTO extends BaseDTO implements Serializable {
+public class HyperLinkDTO implements Serializable {
 
-  private static final long serialVersionUID = 2921606984249560882L;
-
-  private String title;
-  private String description;
-  private String categoryId;
-  private String categoryName;
-  private String creatorName;
-  private String dateEvent;
-  private String creationDate;
-  private String instanceId;
+  private String url;
+  private boolean openNewWindow;
+  private boolean internalLink;
 
   public HyperLinkDTO() {
   }
 
-  @Override
-  public boolean equals(Object obj) {
-    return ((HyperLinkDTO) obj).getId().equals(getId());
-  }
-
-  public String getTitle() {
-    return title;
-  }
-
-  public void setTitle(final String title) {
-    this.title = title;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-  public void setDescription(final String description) {
-    this.description = description;
-  }
-
-  public void setCategoryId(final String categoryId) {
-    this.categoryId = categoryId;
-  }
-
-  public void setCategoryName(final String categoryName) {
-    this.categoryName = categoryName;
-  }
-
-  public String getCategoryId() {
-    return categoryId;
-  }
-
-  public String getCategoryName() {
-    return categoryName;
-  }
-
-  public void setCreatorName(final String creatorName) {
-    this.creatorName = creatorName;
-  }
-
-  public String getCreatorName() {
-    return creatorName;
-  }
-
-  public void setDateEvent(final String dateEvent) {
-    this.dateEvent = dateEvent;
+  public String getUrl() {
+    return url;
   }
 
-  public void setCreationDate(final String creationDate) {
-    this.creationDate = creationDate;
+  public void setUrl(String url) {
+    this.url = url;
   }
 
-  public String getDateEvent() {
-    return dateEvent;
+  public boolean getOpenNewWindow() {
+    return openNewWindow;
   }
 
-  public String getCreationDate() {
-    return creationDate;
+  public void setOpenNewWindow(boolean openNewWindow) {
+    this.openNewWindow = openNewWindow;
   }
 
-  public String getInstanceId() {
-    return instanceId;
+  public boolean getInternalLink() {
+    return internalLink;
   }
 
-  public void setInstanceId(final String instanceId) {
-    this.instanceId = instanceId;
+  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/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);
 }

From 1a96d21c8d8cbbb709ccbcf6cf39c1ef6695f147 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 3 Aug 2023 16:36:15 +0200
Subject: [PATCH 036/228] Feature #13677

---
 .../org/silverpeas/mobile/mobileSettings.properties        | 2 ++
 .../mobile/server/services/ServiceNavigation.java          | 7 +++----
 2 files changed, 5 insertions(+), 4 deletions(-)

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..b8d0277dc 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
@@ -34,6 +34,8 @@ spacehomepage.lastpublications=true
 # display last events or not on spaces home page
 spacehomepage.lastevents=true
 
+spacehomepage.displayUrlType=true
+
 # home page zones order
 homepage.zone.changeorder=false
 homepage.spaces.order=2
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..d3e08343a 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
@@ -400,11 +400,10 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
         }
       } else if (spaceId != null) {
         SpaceInst space = Administration.get().getSpaceInstById(spaceId);
-        if (space.getFirstPageType() == HomePages.URL.getValue()) {
+        if (space.getFirstPageType() == HomePages.URL.getValue() &&
+                getSettings().getBoolean("spacehomepage.displayUrlType")) {
           String html =
-              "<iframe frameborder='0' onLoad='javaScript:this.height = this.contentWindow" +
-                  ".document.body" +
-                  ".scrollHeight ;' style='width:100%;' src='" + space.getFirstPageExtraParam() +
+              "<iframe frameborder='0' style='width:100vw;height:100vh' src='" + space.getFirstPageExtraParam() +
                   "'></iframe>";
           data.setHtmlFreeZone(html);
         }

From 4888443fea8bd3bb517e77ba549ca43eaf00f418 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 6 Aug 2023 23:27:36 +0200
Subject: [PATCH 037/228] Update dependency on Silverpeas to version
 6.4-JR-build230806

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 5b484328f..ed5a3c638 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230802</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230806</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 01416169f395095533515e3fd69110188be13640 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 13 Aug 2023 23:28:22 +0200
Subject: [PATCH 038/228] Update dependency on Silverpeas to version
 6.4-JR-build230813

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index ed5a3c638..4614cb070 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230806</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230813</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 4d3ec9eb398a2ea935220ee314b616d6c5ef63af Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 16 Aug 2023 23:28:43 +0200
Subject: [PATCH 039/228] Update dependency on Silverpeas to version
 6.4-JR-build230816

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 4614cb070..015dd84e0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230813</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230816</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 2cac814824a716374e27fcbb5c2b1d9b2d173548 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 21 Aug 2023 12:35:47 +0200
Subject: [PATCH 040/228] Update dependency on Silverpeas to version
 6.4-JR-build230821

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 015dd84e0..53e8d660d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230816</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230821</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From d813f82cf7aba17080e01661163656f8e9e4ff83 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 23 Aug 2023 23:28:37 +0200
Subject: [PATCH 041/228] Update dependency on Silverpeas to version
 6.4-JR-build230823

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 53e8d660d..807a5bfad 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230821</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230823</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From d413cdbe966065d20f58acddcef3f31188b43fab Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 28 Aug 2023 16:08:24 +0200
Subject: [PATCH 042/228] Update dependency on Silverpeas to version
 6.4-JR-build230828

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 807a5bfad..432d9fbff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230823</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230828</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From cb45b3394fcc854f94d3c2cf13098a0f389d92ab Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 3 Sep 2023 23:28:57 +0200
Subject: [PATCH 043/228] Update dependency on Silverpeas to version
 6.4-JR-build230903

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 432d9fbff..ed9d36f7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230828</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230903</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From ab55868257d9e6e0a586dea3620665019cfa9ec3 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Thu, 7 Sep 2023 20:59:44 +0200
Subject: [PATCH 044/228] Update dependency on Silverpeas to version
 6.4-JR-build230907

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index ed9d36f7d..34a28a837 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230903</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230907</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From ece21ac4a49eba9df694973205620a89f50732b9 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 10 Sep 2023 23:29:35 +0200
Subject: [PATCH 045/228] Update dependency on Silverpeas to version
 6.4-JR-build230910

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 34a28a837..ca752f54f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230907</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230910</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 2acb054211c7b052b5c484a3c3289186c9838683 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 13 Sep 2023 23:29:16 +0200
Subject: [PATCH 046/228] Update dependency on Silverpeas to version
 6.4-JR-build230913

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index ca752f54f..a0360f91e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230910</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230913</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 985cebb23aaf9b1af8c167cb793242baca148727 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 14 Sep 2023 10:52:44 +0200
Subject: [PATCH 047/228] Add current spaceid in http session

---
 .../org/silverpeas/mobile/server/services/ServiceNavigation.java | 1 +
 1 file changed, 1 insertion(+)

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 d3e08343a..2bc0a3fef 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
@@ -235,6 +235,7 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
     if (spaceId.equals("null")) spaceId = null;
 
     initSilverpeasSession();
+    request.getSession().setAttribute("Silverpeas_Portlet_SpaceId", spaceId);
 
     String look = "";
     try {

From 2f91baf3a4400f619a3d38ec76386a00521ca73f Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 15 Sep 2023 15:20:17 +0200
Subject: [PATCH 048/228] Fix #13747

---
 .../client/resources/ApplicationMessages.java   |  2 +-
 .../resources/ApplicationMessages_en.properties |  2 +-
 .../resources/ApplicationMessages_fr.properties |  4 ++--
 .../server/services/helpers/NewsHelper.java     | 17 +++++++----------
 4 files changed, 11 insertions(+), 14 deletions(-)

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..7dd15b073 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
@@ -45,7 +45,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-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- Tous droits réservés")
   SafeHtml copyright();
 
   @DefaultMessage("Parcourir la plateforme")
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..3948f3666 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
@@ -30,7 +30,7 @@ confirmBtnLabel=Confirm
 cancelBtnLabel=Cancel
 correctBtnLabel=Correct
 
-copyright=© 2001-2016 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- All rights reserved
+copyright=© 2001-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- All rights reserved
 infoTitle=Information
 ok=OK
 
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..2b050fc99 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
@@ -29,7 +29,7 @@ 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-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- Tous droits réservés
 
 infoTitle=Information
 ok=OK
@@ -85,4 +85,4 @@ 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
\ No newline at end of file
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..8e2c2336c 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,6 +36,7 @@
 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;
@@ -55,12 +56,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
@@ -126,12 +122,13 @@ private boolean isVisibleNews(PublicationDetail news) {
   private List<News> getDelegatedNews(String userId) throws Exception {
     List<News> news = new ArrayList();
     List<DelegatedNews> delegatedNews = DelegatedNewsServiceProvider.getDelegatedNewsService().getAllValidDelegatedNews();
-
+    UserDetail u = Administration.get().getUserDetail(userId);
+    Date now = new Date();
     for (DelegatedNews delegated : delegatedNews) {
-      PublicationDetail pub = delegated.getPublicationDetail();
-      if (pub.canBeAccessedBy(Administration.get().getUserDetail(userId))) {
+      if (delegated.isValidated() && (delegated.getBeginDate() != null && now.after(delegated.getBeginDate()))
+              && (delegated.getEndDate() != null && now.before(delegated.getEndDate()))) {
         News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId());
-        news.add(aNews);
+        if (aNews.canBeAccessedBy(u)) news.add(aNews);
       }
     }
 

From e28740a2e775b90ed6cbe4de4de5c05eb2eb3226 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 15 Sep 2023 16:57:25 +0200
Subject: [PATCH 049/228] Fix
 https://tracker.silverpeas.org/issues/13677#note-4

---
 .../mobile/server/services/ServiceNavigation.java           | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

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 2bc0a3fef..904efb12f 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
@@ -403,9 +403,11 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
         SpaceInst space = Administration.get().getSpaceInstById(spaceId);
         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 =
-              "<iframe frameborder='0' style='width:100vw;height:100vh' src='" + space.getFirstPageExtraParam() +
-                  "'></iframe>";
+                  "<iframe frameborder='0' style='width:100vw;height:100vh' src='" + url +
+                          "'></iframe>";
           data.setHtmlFreeZone(html);
         }
       }

From b6b84cb934458bd7e0c4127674d2e285fe0c0ccc Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 17 Sep 2023 23:29:51 +0200
Subject: [PATCH 050/228] Update dependency on Silverpeas to version
 6.4-JR-build230917

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index a0360f91e..7558de1e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230913</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230917</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 7cb2dbcc13dce433e334be4ce91a63699c5b1bb6 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 18 Sep 2023 16:43:48 +0200
Subject: [PATCH 051/228] Feature #13677 : space permalink

---
 .../src/main/java/org/silverpeas/bridge/MobilFilter.java    | 3 +++
 .../src/main/java/org/silverpeas/mobile/client/SpMobil.java | 6 +++---
 .../mobile/client/apps/navigation/NavigationApp.java        | 2 +-
 3 files changed, 7 insertions(+), 4 deletions(-)

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 dd9af6aeb..aaa6e9d54 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -177,6 +177,9 @@ 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;
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..fc8ba0d9e 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
@@ -267,9 +267,9 @@ public static void displayMainPage() {
     PageHistory.getInstance().goTo(new HomePage());
 
     if ((shortcutAppId != null && shortcutContentType != null && shortcutContentId != null) ||
-        shortcutContributionId != null ||
-        (shortcutContentType != null && shortcutContentType.equals("Component") &&
-            shortcutAppId != null)) {
+            shortcutContributionId != null ||
+            (shortcutContentType != null && (shortcutContentType.equals("Component") || shortcutContentType.equals("Space")) &&
+                    shortcutAppId != null)) {
       ShortCutRouter.route(user, shortcutAppId, shortcutContentType, shortcutContentId,
           shortcutContributionId, shortcutRole);
     } else {
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..d2a4fad8a 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
@@ -102,7 +102,7 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) {
   public void showContent(final NavigationShowContentEvent event) {
     if (event.getContent().getType().equals(ContentsTypes.Space.name())) {
       NavigationPage page = new NavigationPage();
-      page.setRootSpaceId(event.getContent().getId());
+      page.setRootSpaceId(event.getContent().getInstanceId());
       page.show();
     }
   }

From c56bcb9b73b8029057d748d731681c5256c0293a Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 20 Sep 2023 19:01:47 +0200
Subject: [PATCH 052/228] Fix gallery permalink

---
 .../mobile/client/apps/media/MediaApp.java    | 20 ++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

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..ff28dc6a2 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
@@ -215,10 +215,28 @@ 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()) ||

From d045c7fa535bb5bad40b0d957500d9e0f023a725 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 20 Sep 2023 23:29:22 +0200
Subject: [PATCH 053/228] Update dependency on Silverpeas to version
 6.4-JR-build230920

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 7558de1e4..49f541b57 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230917</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230920</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 1a60b46700161e77d6f459e7a1e3dd77481a2249 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 21 Sep 2023 16:33:49 +0200
Subject: [PATCH 054/228] Fix permalink quickinfo app

---
 .../mobile/client/apps/news/NewsApp.java      | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

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) {

From a587fa2f3a6b3b32d52b2878a15fe6be0ec18529 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 21 Sep 2023 17:39:04 +0200
Subject: [PATCH 055/228] Fix permalink on topic

---
 .../src/main/java/org/silverpeas/bridge/MobilFilter.java     | 5 +++++
 1 file changed, 5 insertions(+)

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 aaa6e9d54..9698ac45a 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -116,6 +116,11 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
           String appId = pub.getInstanceId();
           params = "?shortcutContentType=Publication&shortcutContentId=" + id + "&shortcutAppId=" +
                   appId;
+        } 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);

From 00cbb19dc87a0102b6fe254c5ad3950a80aef1b3 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 22 Sep 2023 18:47:25 +0200
Subject: [PATCH 056/228] Fix loop on relogin

---
 .../main/java/org/silverpeas/mobile/client/SpMobil.java  | 5 ++++-
 mobile-war/src/main/webapp/spmobile/spmobil.jsp          | 9 ++++++---
 2 files changed, 10 insertions(+), 4 deletions(-)

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 fc8ba0d9e..86cc0f5ff 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
@@ -77,6 +77,7 @@
 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;
@@ -177,6 +178,8 @@ public void onModuleLoad() {
     EventBus.getInstance().addHandler(ExceptionEvent.TYPE, new ErrorManager());
     EventBus.getInstance().addHandler(AbstractAuthenticationErrorEvent.TYPE, this);
 
+    SSO = !ResourcesManager.getSSOPath().isEmpty();
+
     loadIds(null);
 
     NodeList<Element> tags = Document.get().getElementsByTagName("meta");
@@ -370,7 +373,6 @@ public void onFailure(final Method method, final Throwable t) {
           tryToRelogin(attempt);
         }
       };
-      SSO = true;
       action.attempt();
     } else {
       //Login
@@ -446,6 +448,7 @@ public static void displayLoginPage(AuthenticationException error) {
     ConnexionPage connexionPage = new ConnexionPage();
     connexionPage.setAuthenticateError(error);
     RootPanel.get().clear();
+    PageHistory.getInstance().clear();
     RootPanel.get().add(connexionPage);
   }
 
diff --git a/mobile-war/src/main/webapp/spmobile/spmobil.jsp b/mobile-war/src/main/webapp/spmobile/spmobil.jsp
index 4ef5e0867..0fd2140b2 100644
--- a/mobile-war/src/main/webapp/spmobile/spmobil.jsp
+++ b/mobile-war/src/main/webapp/spmobile/spmobil.jsp
@@ -157,9 +157,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"

From ac2f73153fae5b34753378bf919490a8d9609e05 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 24 Sep 2023 23:30:44 +0200
Subject: [PATCH 057/228] Update dependency on Silverpeas to version
 6.4-JR-build230924

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 49f541b57..2371c468b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230920</silverpeas.version>
+    <silverpeas.version>6.4-JR-build230924</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 404c25575508a6a9a4dbe32b700c5cc960afac5e Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 1 Oct 2023 23:29:08 +0200
Subject: [PATCH 058/228] Update dependency on Silverpeas to version
 6.4-JR-build231001

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 2371c468b..c68fb8eac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build230924</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231001</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 7189e60e49499c6e82489e2c2202fbd53d5235e3 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Tue, 3 Oct 2023 15:58:09 +0200
Subject: [PATCH 059/228] Update dependency on Silverpeas to version
 6.4-JR-build231003

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index c68fb8eac..4e68dc5d9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231001</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231003</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From f1c3bcad97e2d20afd03eb4f9e1540c2623e6560 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 4 Oct 2023 20:34:24 +0200
Subject: [PATCH 060/228] Allow external access for specific jsp

---
 .../org/silverpeas/bridge/MobilFilter.java    |  3 ++
 .../org/silverpeas/mobile/client/SpMobil.java |  3 ++
 .../common/navigation/LinksManager.java       |  2 +-
 .../services/AbstractRestWebService.java      | 32 +++++++++++++++++++
 .../server/services/ServiceConnection.java    |  2 ++
 .../server/services/ServiceNavigation.java    | 30 +----------------
 6 files changed, 42 insertions(+), 30 deletions(-)

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 9698ac45a..b6a36f871 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -188,6 +188,9 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
         } 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/"))) {
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 86cc0f5ff..2576e504e 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,6 +74,7 @@
 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;
@@ -275,6 +276,8 @@ public static void displayMainPage() {
                     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>() {
 
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 9c8bcafcb..9bb409b64 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
@@ -127,7 +127,7 @@ public static void openExternalLink(String url, boolean openNewWindow, boolean i
     }
   }
 
-  private static void openIframePage(String url) {
+  public static void openIframePage(String url) {
     IframePage page = new IframePage(url);
     page.setPageTitle("");
     page.show();
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..fb02aa517 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,10 +4,15 @@
 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;
@@ -43,6 +48,33 @@ protected void setMainsessioncontroller(String login, String password, String do
         new MainSessionController(key, getHttpRequest().getSession());
   }
 
+  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) {
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/ServiceNavigation.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java
index 904efb12f..fea109d7b 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
@@ -192,34 +192,6 @@ private DetailUserDTO initSession(DetailUserDTO user) {
       return null;
     }
   }
-
-  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);
   }
@@ -234,7 +206,7 @@ protected UserDetail getUserInSession() {
   public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
     if (spaceId.equals("null")) spaceId = null;
 
-    initSilverpeasSession();
+    initSilverpeasSession(request);
     request.getSession().setAttribute("Silverpeas_Portlet_SpaceId", spaceId);
 
     String look = "";

From a850f4c676fb7c6af4af1c979cb5f286c18abfb3 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 8 Oct 2023 23:31:28 +0200
Subject: [PATCH 061/228] Update dependency on Silverpeas to version
 6.4-JR-build231008

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 4e68dc5d9..b48048300 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231003</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231008</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 8863b41833ad3a38937b659ebf6b4c8890881bac Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 11 Oct 2023 23:30:59 +0200
Subject: [PATCH 062/228] Update dependency on Silverpeas to version
 6.4-JR-build231011

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index b48048300..31c6832fe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231008</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231011</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From aa0b5915bfc11700bdde6e644f976d43262aa172 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 13 Oct 2023 12:05:01 +0200
Subject: [PATCH 063/228] Add technicals elements for speech and speak features

---
 .../mobile/client/common/Html5Utils.java      | 102 ++++++++++++++++++
 .../mobile/client/common/Voice.java           |  16 +++
 .../event/speech/AbstractSpeechEvent.java     |  40 +++++++
 .../common/event/speech/SpeechErrorEvent.java |  38 +++++++
 .../event/speech/SpeechEventHandler.java      |  38 +++++++
 .../event/speech/SpeechResultEvent.java       |  44 ++++++++
 .../common/event/speech/SpeechStartEvent.java |  38 +++++++
 .../common/event/speech/SpeechStopEvent.java  |  38 +++++++
 8 files changed, 354 insertions(+)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/Voice.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/AbstractSpeechEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechErrorEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechEventHandler.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechResultEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStartEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechStopEvent.java

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..8231e7a0d 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,7 +24,13 @@
 
 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.Window;
+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
@@ -65,4 +71,100 @@ 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 native void speak(String text) /*-{
+    var msg = new SpeechSynthesisUtterance();
+    msg.text = text;
+    speechSynthesis.speak(msg);
+  }-*/;
+
+  public static native void cancelSpeaking() /*-{
+    speechSynthesis.cancel();
+  }-*/;
+  public 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);
+    }-*/;
+
+  public 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());
+  }
 }
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/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/common/event/speech/SpeechErrorEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechErrorEvent.java
new file mode 100644
index 000000000..283125702
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/event/speech/SpeechErrorEvent.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 SpeechErrorEvent extends AbstractSpeechEvent {
+
+
+  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);
+  }
+}

From 567a78ed5bb34fe2c00b9372f9f2f984d45cc440 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 15 Oct 2023 23:29:22 +0200
Subject: [PATCH 064/228] Update dependency on Silverpeas to version
 6.4-JR-build231015

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 31c6832fe..639a15704 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231011</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231015</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 7fae2a930e8a40ea4d7ee12ccd64b4f47d1f941a Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 18 Oct 2023 23:31:02 +0200
Subject: [PATCH 065/228] Update dependency on Silverpeas to version
 6.4-JR-build231018

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 639a15704..2e9c798e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231015</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231018</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 26ace7ed611001a6e2e7378ddc68a17e72e2ae91 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 22 Oct 2023 23:28:52 +0200
Subject: [PATCH 066/228] Update dependency on Silverpeas to version
 6.4-JR-build231022

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 2e9c798e8..696ac06ca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231018</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231022</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 2c600857863656f3f4082a5306ecc4e5dd768314 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 25 Oct 2023 23:29:23 +0200
Subject: [PATCH 067/228] Update dependency on Silverpeas to version
 6.4-JR-build231025

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 696ac06ca..b9f91bc17 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231022</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231025</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From e91679e56342d1ad6dd196bb77967ba517c79085 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 26 Oct 2023 15:50:07 +0200
Subject: [PATCH 068/228] Feature #13824

---
 .../apps/documents/pages/PublicationPage.java | 10 +++
 .../components/attachments/Attachment.java    | 89 ++++++++++++-------
 .../server/services/ServiceDocuments.java     | 13 +++
 .../shared/dto/documents/PublicationDTO.java  |  9 ++
 .../dto/documents/SimpleDocumentDTO.java      |  9 ++
 5 files changed, 99 insertions(+), 31 deletions(-)

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..f0052c2a5 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
@@ -157,6 +157,16 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
   @Override
   public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEvent event) {
     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.setAttachment(attachment);
       a.setSharing(event.getShare());
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..b7bb7612b 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
@@ -49,6 +49,7 @@
 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;
@@ -95,9 +96,9 @@ public void setAttachment(SimpleDocumentDTO data) {
   private void render() {
     Image img = null;
     String sizeValue;
-      /*if (!data..isDownloadAllowed()) {
-        link.setStylePrimaryName("not-downloadable");
-      }*/
+    if (!data.isDownloadable()) {
+      link.setStylePrimaryName("not-downloadable");
+    }
     if (data.getSize() < 1024 * 1024) {
       sizeValue = String.valueOf(data.getSize() / 1024);
       size.setInnerHTML(msg.sizeK(sizeValue));
@@ -135,45 +136,71 @@ private void render() {
     // 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();
-
+      if (data.isDownloadable()) {
+        url += "componentId/";
+        url += data.getInstanceId();
+        url += "/attachmentId/";
+        url += data.getId();
+        url += "/lang/";
+        url += data.getLang();
+        url += "/name/";
+        url += data.getFileName();
+      } else {
+        url = "#";
+      }
       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);
+        if (data.isDownloadable()) {
+          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");
+            }
+          });
+        } else {
+          link.addClickHandler(new ClickHandler() {
+            @Override
+            public void onClick(final ClickEvent clickEvent) {
+              viewDocument();
             }
-            Window.open(u, "_blank", "fullscreen=yes");
-          }
-        });
+          });
+        }
       } 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());
+        if (data.isDownloadable()) {
+          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());
+              }
             }
-          }
-        });
+          });
+        } else {
+          link.addClickHandler(new ClickHandler() {
+            @Override
+            public void onClick(final ClickEvent clickEvent) {
+              viewDocument();
+            }
+          });
+        }
       }
     } catch (JavaScriptException e) {
       Notification.alert(e.getMessage());
     }
 
   }
+
+  private void viewDocument() {
+    IframePage page = new IframePage("/silverpeas/services/media/viewer/embed/pdf?documentId="+data.getId()+"&documentType=attachment&language="+data.getLang()+"&embedPlayer=true");
+    page.show();
+  }
+
   @UiHandler("share")
   protected void share(ClickEvent event) {
     SharingPage page = new SharingPage();
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..2b4092ce9 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
@@ -41,6 +41,7 @@
 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.attachment.util.SimpleDocumentList;
 import org.silverpeas.core.contribution.publication.model.CompletePublication;
 import org.silverpeas.core.contribution.publication.model.PublicationDetail;
 import org.silverpeas.core.contribution.publication.model.PublicationLink;
@@ -444,6 +445,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 {
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..4c223c998 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
@@ -47,6 +47,8 @@ public class PublicationDTO extends BaseDTO implements Serializable, Comparable<
   private String vignette;
   private int viewsNumber;
 
+  private List<String> notAllowedDownloads;
+
   public String getName() {
     return name;
   }
@@ -136,4 +138,11 @@ 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;
+  }
 }
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;
+  }
 }

From 0d37d1ab5e768c419ec7c442d20bd241f8cc9673 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Mon, 30 Oct 2023 20:44:08 +0100
Subject: [PATCH 069/228] Update dependency on Silverpeas to version
 6.4-JR-build231030

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index b9f91bc17..db3155da7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231025</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231030</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 75a4c4e38a2a2116f558dc3f9445f6e3ec6e71f5 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 31 Oct 2023 16:03:46 +0100
Subject: [PATCH 070/228] Fix Feature #13824

---
 mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java | 2 ++
 1 file changed, 2 insertions(+)

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 b6a36f871..28e25b71e 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -97,6 +97,7 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
       final boolean isMobile = Boolean.TRUE.equals(mobileAlreadyDetected)
                                || userAgent.contains("Android")
                                || userAgent.contains("iPhone");
+
       session.setAttribute("isMobile", isMobile);
 
       final boolean tablet = session.getAttribute("tablet", Boolean.class, false);
@@ -105,6 +106,7 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
 
       if (isMobile && !url.contains("sso") && !url.contains("services") &&
           !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") &&

From 70e93a98d3c2ccc1d976aa39a3dab4c9ad65932f Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 1 Nov 2023 23:28:36 +0100
Subject: [PATCH 071/228] Update dependency on Silverpeas to version
 6.4-JR-build231101

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index db3155da7..c6cb39cfa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231030</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231101</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 9b970de005dad3e4e65fde9a94873225cf497858 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 3 Nov 2023 17:37:39 +0100
Subject: [PATCH 072/228] Feature #13833

---
 .../client/apps/documents/DocumentsApp.java   | 22 ++++++
 .../events/app/DocumentsAppEventHandler.java  |  2 +
 .../app/DocumentsNextPublicationEvent.java    | 50 +++++++++++++
 .../apps/documents/pages/PublicationPage.java | 36 +++++++--
 .../documents/pages/PublicationPage.ui.xml    | 31 ++++----
 .../server/services/ServiceDocuments.java     | 73 ++++++++++++++++++-
 .../services/rest/ServiceDocuments.java       |  7 ++
 7 files changed, 197 insertions(+), 24 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsNextPublicationEvent.java

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..07bd6efe4 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
@@ -47,6 +47,7 @@
 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;
@@ -310,4 +311,25 @@ 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));
+      }
+    });
+  }
 }
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..7a7a7f67f 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,6 @@ public interface DocumentsAppEventHandler extends EventHandler {
 	void loadPublication(DocumentsLoadPublicationEvent event);
   void loadAttachments(DocumentsLoadAttachmentsEvent event);
   void share(DocumentsSharingEvent event);
+
+  void nextPublication(DocumentsNextPublicationEvent event);
 }
\ No newline at end of file
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/pages/PublicationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java
index f0052c2a5..5f4dadff8 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
@@ -35,12 +35,11 @@
 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 com.google.gwt.user.client.ui.*;
 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.app.DocumentsNextPublicationEvent;
 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;
@@ -54,6 +53,10 @@
 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;
@@ -66,7 +69,7 @@
 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);
 
@@ -75,6 +78,8 @@ public class PublicationPage extends PageContent
   @UiField
   HeadingElement title;
   @UiField
+  FocusPanel supercontainer;
+  @UiField
   HTMLPanel container;
   @UiField
   UnorderedList attachments, linkedPublications;
@@ -98,17 +103,37 @@ public class PublicationPage extends PageContent
   private ShareButton share = new ShareButton();
   private ContentDTO contentDTO = null;
 
+  private SwipeRecognizer swipeRecognizer;
+
+  @Override
+  public void onSwipeEnd(SwipeEndEvent event) {
+    if (!isVisible()) return;
+    String direction = "left";
+    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","height:100vh;");
     container.getElement().setId("publication");
     attachments.getElement().setId("attachments");
     linkedPublications.getElement().setId("linkedPublications");
     content.setId("content");
+    content.getStyle().setDisplay(Style.Display.NONE);
     EventBus.getInstance().addHandler(AbstractPublicationPagesEvent.TYPE, this);
+    EventBus.getInstance().addHandler(SwipeEndEvent.getType(), this);
   }
 
   @Override
@@ -116,6 +141,7 @@ 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) {
@@ -152,6 +178,7 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
       PublicationContentHelper.showContent(publication.getId(), publication.getInstanceId(), content);
     }
     contentLink.setVisible(publication.getContent());
+    swipeRecognizer = new SwipeRecognizer(supercontainer);
   }
 
   @Override
@@ -237,7 +264,6 @@ 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);
   }
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..dd3d0b0ce 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,21 @@
              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"/>
 
-    <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/server/services/ServiceDocuments.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java
index 2b4092ce9..24f155300 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
@@ -42,10 +42,8 @@
 import org.silverpeas.core.contribution.attachment.model.SimpleDocument;
 import org.silverpeas.core.contribution.attachment.model.SimpleDocumentPK;
 import org.silverpeas.core.contribution.attachment.util.SimpleDocumentList;
-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.publication.dao.PublicationCriteria;
+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;
@@ -78,6 +76,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
@@ -619,6 +618,72 @@ 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);
+      //int order = locations.get(0).getPubOrder();
+      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.setCreator(pub.getCreator().getDisplayedName());
+      //dto.setUpdater(organizationController.getUserDetail(pub.getUpdaterId()).getDisplayedName());
+      //dto.setVersion(next.getVersion());
+      dto.setDescription(next.getDescription());
+
+    } catch(Throwable e) {
+      SilverLogger.getLogger(this)
+              .error("ServiceDocumentsImpl.getNextPublication", "root.EX_NO_MESSAGE", e);
+      throw e;
+    }
+    //TODO
+    return dto;
+  }
+
   @Override
   protected String getResourceBasePath() {
     return PATH;
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..7bc2263a1 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,11 @@ 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);
+
 }

From 723c4a7f19399909f9078c96e2cee651b7a4921a Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 5 Nov 2023 23:32:01 +0100
Subject: [PATCH 073/228] Update dependency on Silverpeas to version
 6.4-JR-build231105

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index c6cb39cfa..1e00eecb1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231101</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231105</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From a372d39755f97eda595c3cf6cb0539dd41e71469 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 12 Nov 2023 23:36:50 +0100
Subject: [PATCH 074/228] Update dependency on Silverpeas to version
 6.4-JR-build231112

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 1e00eecb1..2c20272cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231105</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231112</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 0e6900a4dc79650d510beb43138a40f6c4e352a7 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 13 Nov 2023 09:35:01 +0100
Subject: [PATCH 075/228] silent error management

---
 .../mobile/client/common/AuthentificationManager.java     | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

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..176d8d1cf 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;
@@ -263,10 +264,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(), t);
                   if (t instanceof AuthenticationException) {
                     EventBus.getInstance().fireEvent(new AuthenticationErrorEvent(t));
                   } else {
@@ -278,7 +276,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();

From 4beb981eedf62727bf202244b76d3d526a3cf34e Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 13 Nov 2023 16:32:38 +0100
Subject: [PATCH 076/228] method signature changed

---
 .../mobile/server/services/ServiceNotifications.java   |  2 +-
 .../services/helpers/NotificationsPushHelper.java      | 10 ++++------
 2 files changed, 5 insertions(+), 7 deletions(-)

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..80a06fd02 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
@@ -368,7 +368,7 @@ public void delete(List<NotificationBoxDTO> selection) {
     if (selection.get(0) instanceof NotificationSendedDTO) {
       for (NotificationBoxDTO dto : selection) {
         try {
-          SentNotificationInterface.get().deleteNotif((int) dto.getIdNotif(), getUser().getId());
+          SentNotificationInterface.get().deleteNotif(String.valueOf(dto.getIdNotif()), Integer.parseInt(getUser().getId()));
         } catch (NotificationException e) {
           SilverLogger.getLogger(this).error(e);
         }
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..2cc11031b 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,7 +130,7 @@ 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")))
@@ -156,10 +156,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());
   }
 }

From 34a933dd7d54c62498c04c741c185e26c92f7497 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 14 Nov 2023 16:23:23 +0100
Subject: [PATCH 077/228] Fix #13849

---
 .../contacts/pages/widgets/ContactItem.java   |  8 +++----
 .../mobile/shared/dto/DetailUserDTO.java      | 21 ++++++++--------
 .../mobile/shared/dto/PropertyDTO.java        | 24 +++++++++++++++++++
 3 files changed, 39 insertions(+), 14 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java

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..b178a915d 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
@@ -39,6 +39,7 @@
 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 {
 
@@ -125,9 +126,8 @@ public void setData(DetailUserDTO userData) {
       tel.add(new InlineHTML("&nbsp;"));
     }
 
-    for (String prop :userData.getProperties()) {
-
-      String value = userData.getPropertieValue(prop);
+    for (PropertyDTO prop :userData.getProperties()) {
+      String value = prop.getValue();
       if (isPhoneNumber(value)) {
         HTMLPanel field = new HTMLPanel("");
         Anchor tel = new Anchor();
@@ -145,7 +145,7 @@ public void setData(DetailUserDTO userData) {
         container.add(field);
       } else {
         HTML field = new HTML(value);
-        field.setStylePrimaryName(prop);
+        field.setStylePrimaryName(prop.getKey());
         container.add(field);
       }
     }
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..ed1d6840a 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,19 @@ public class DetailUserDTO implements Serializable{
   private String sessionKey;
   private boolean connected;
   private boolean notificationBox;
-  private LinkedHashMap<String, String> properties = new LinkedHashMap<String, String>();
+  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() {
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;
+    }
+}

From 42a54c9dea1cf1e1f6318cdf880fe05e32c5453a Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 14 Nov 2023 18:48:55 +0100
Subject: [PATCH 078/228] Fix #13853

---
 .../mobile/client/apps/media/pages/widgets/AddMediaButton.java  | 2 +-
 .../org/silverpeas/mobile/server/services/ServiceMedia.java     | 2 +-
 .../silverpeas/mobile/shared/services/rest/ServiceMedia.java    | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

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..3486efd17 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
@@ -103,7 +103,7 @@ 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());
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..c8d846b16 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
@@ -400,7 +400,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/shared/services/rest/ServiceMedia.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java
index 0d2674a6d..5ef688498 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
@@ -92,6 +92,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);
 }

From 2475c22b5fedd074b831a5bb2d96dd90463e7e28 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 15 Nov 2023 15:02:20 +0100
Subject: [PATCH 079/228] Fix #13854

---
 .../mobile/client/apps/documents/pages/widgets/GedItem.java | 2 +-
 .../silverpeas/mobile/server/services/ServiceDocuments.java | 6 +-----
 2 files changed, 2 insertions(+), 6 deletions(-)

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..1869666de 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
@@ -62,7 +62,7 @@ public void setData(Object data) {
       dataTopic = (TopicDTO) data;
       if (dataTopic.getId().equals("1")) {
         setStyleName("trash");
-        link.setText(dataTopic.getName());
+        link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")");
       } else {
         setStyleName("folder-ged");
         link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")");
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 24f155300..3bab5eaf3 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
@@ -629,7 +629,6 @@ public PublicationDTO getNextPublication(@PathParam("appId") String instanceId,
       PublicationDetail pub = getPubBm().getDetail(pubPK);
 
       List<Location> locations = getPubBm().getAllLocations(pubPK);
-      //int order = locations.get(0).getPubOrder();
       String folderId = locations.get(0).getLocalId();
 
 
@@ -670,9 +669,6 @@ public PublicationDTO getNextPublication(@PathParam("appId") String instanceId,
 
       dto.setId(next.getId());
       dto.setName(next.getName());
-      //dto.setCreator(pub.getCreator().getDisplayedName());
-      //dto.setUpdater(organizationController.getUserDetail(pub.getUpdaterId()).getDisplayedName());
-      //dto.setVersion(next.getVersion());
       dto.setDescription(next.getDescription());
 
     } catch(Throwable e) {
@@ -680,7 +676,7 @@ public PublicationDTO getNextPublication(@PathParam("appId") String instanceId,
               .error("ServiceDocumentsImpl.getNextPublication", "root.EX_NO_MESSAGE", e);
       throw e;
     }
-    //TODO
+
     return dto;
   }
 

From 350e645117e3474745a9c3efd9b69e5768e150e0 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 15 Nov 2023 15:03:56 +0100
Subject: [PATCH 080/228] Fix #13854

---
 .../mobile/client/apps/documents/pages/widgets/GedItem.java    | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

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 1869666de..13375de45 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
@@ -62,11 +62,10 @@ public void setData(Object data) {
       dataTopic = (TopicDTO) data;
       if (dataTopic.getId().equals("1")) {
         setStyleName("trash");
-        link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")");
       } else {
         setStyleName("folder-ged");
-        link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")");
       }
+      link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")");
     } else if (data instanceof PublicationDTO) {
       dataPublication = (PublicationDTO) data;
       link.setHTML(dataPublication.getName());

From 906ee17ef6bb6a8a7c9927d37b48742bbe0b5d02 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 15 Nov 2023 16:03:06 +0100
Subject: [PATCH 081/228] Feature #13850

---
 .../mobile/client/apps/workflow/pages/WorkflowPage.java       | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

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..0368a0ea4 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
@@ -31,6 +31,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.FlexTable;
 import com.google.gwt.user.client.ui.ListBox;
@@ -94,7 +95,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 +108,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);

From 48ed3f5d6083fcde84be651b45206ed15f2b0303 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 15 Nov 2023 16:35:33 +0100
Subject: [PATCH 082/228] update lib

---
 mobile-war/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mobile-war/pom.xml b/mobile-war/pom.xml
index f5e088b3b..c756f169c 100644
--- a/mobile-war/pom.xml
+++ b/mobile-war/pom.xml
@@ -396,7 +396,7 @@
     <dependency>
       <groupId>commons-fileupload</groupId>
       <artifactId>commons-fileupload</artifactId>
-      <version>1.4</version>
+      <version>1.5</version>
     </dependency>
 
   </dependencies>

From ec98f9c3c9077501ca820e10a1e78fc95b7172b0 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 15 Nov 2023 23:34:15 +0100
Subject: [PATCH 083/228] Update dependency on Silverpeas to version
 6.4-JR-build231115

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 2c20272cd..381035517 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231112</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231115</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 08610809a213652b6401a4ea086200e29bd2bdec Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 16 Nov 2023 11:49:19 +0100
Subject: [PATCH 084/228] Fix #13849

---
 .../contacts/pages/widgets/ContactItem.java   | 54 ++++++++++---------
 1 file changed, 28 insertions(+), 26 deletions(-)

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 b178a915d..f80da82c6 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
@@ -86,12 +86,12 @@ 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);
-      nbTel++;
+        Anchor tel1 = new Anchor();
+        tel1.setStyleName("tel-link");
+        tel1.setText(userData.getPhoneNumber());
+        tel1.setHref("tel:" + userData.getPhoneNumber());
+        tel.add(tel1);
+        nbTel++;
     }
     if (userData.getCellularPhoneNumber() != null && !userData.getCellularPhoneNumber().isEmpty()) {
       if (nbTel == 1) {
@@ -123,30 +123,32 @@ public void setData(DetailUserDTO userData) {
       nbTel++;
     }
     if (nbTel == 0) {
-      tel.add(new InlineHTML("&nbsp;"));
+      tel.setVisible(false);
     }
 
     for (PropertyDTO prop :userData.getProperties()) {
       String value = prop.getValue();
-      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.getKey());
-        container.add(field);
+      if (value != null & !value.isEmpty()) {
+        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.getKey());
+          container.add(field);
+        }
       }
     }
   }

From 8271e23b46598271a8cd46d62b025418ed5ca4a3 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 19 Nov 2023 23:32:49 +0100
Subject: [PATCH 085/228] Update dependency on Silverpeas to version
 6.4-JR-build231119

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 381035517..44bb2bc27 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231115</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231119</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From c2e23e1b560eea6735aa5ae49c8604b0f27b4bcf Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 22 Nov 2023 23:35:20 +0100
Subject: [PATCH 086/228] Update dependency on Silverpeas to version
 6.4-JR-build231122

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 44bb2bc27..2ceaf0cbb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231119</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231122</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 26c93b184b195ab7957fc22e6456ab6344d366a6 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 28 Nov 2023 15:00:35 +0100
Subject: [PATCH 087/228] Fix #13868

---
 mobile-war/src/main/webapp/WEB-INF/app-init.template | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

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..d6b6c70b0 100644
--- a/mobile-war/src/main/webapp/WEB-INF/app-init.template
+++ b/mobile-war/src/main/webapp/WEB-INF/app-init.template
@@ -22,7 +22,8 @@ if (firebaseConfig != null) {
 
   messaging.onMessage(payload => {
     const notificationOptions = {
-      body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png'
+      body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png',
+      data : payload.data
     };
 
     navigator.serviceWorker.getRegistration('/silverpeas/spmobile/').then(registration => {

From 883d07522b49fecfbe8e243d4a078e5a9f182ee3 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 28 Nov 2023 17:39:53 +0100
Subject: [PATCH 088/228] Fix #13869

---
 .../server/UserNotificationServerEventMobileListener.java   | 6 ++++++
 .../server/services/helpers/NotificationsPushHelper.java    | 1 +
 mobile-war/src/main/webapp/WEB-INF/app-init.template        | 4 ++--
 mobile-war/src/main/webapp/WEB-INF/app-sw.template          | 4 ++--
 4 files changed, 11 insertions(+), 4 deletions(-)

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..75790745d 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,10 @@ 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));
+        data.put("body", Jsoup.parse(msg.getBody()).wholeText());
         NotificationsPushHelper.getInstance().sendNotification(emitterUserId, data);
       }
     } catch(Exception e) {
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 2cc11031b..0f8ac611e 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
@@ -135,6 +135,7 @@ public String sendToToken(final String userId, String token, Map<String, Object>
           .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("permalink", l))
           .map(m -> m.setToken(token))
           .map(Message.Builder::build)
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 d6b6c70b0..e5fc4b19f 100644
--- a/mobile-war/src/main/webapp/WEB-INF/app-init.template
+++ b/mobile-war/src/main/webapp/WEB-INF/app-init.template
@@ -22,12 +22,12 @@ if (firebaseConfig != null) {
 
   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..3d8b055ca 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
     };
 

From 51ac225be881326c0287ed0c869b7e6e9893c7c4 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 29 Nov 2023 11:16:14 +0100
Subject: [PATCH 089/228] Fix #13871

---
 .../server/UserNotificationServerEventMobileListener.java      | 1 +
 .../server/services/helpers/NotificationsPushHelper.java       | 1 +
 mobile-war/src/main/webapp/WEB-INF/app-sw.template             | 3 +++
 3 files changed, 5 insertions(+)

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 75790745d..5dc7d34e7 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
@@ -55,6 +55,7 @@ public void on(final UserNotificationServerEvent event) {
       if (Boolean.TRUE.equals(isCreation)) {
         SILVERMAILMessage msg =  SILVERMAILPersistence.getMessage(event.getEmitterUserId(), Long.valueOf(id));
         data.put("body", Jsoup.parse(msg.getBody()).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/helpers/NotificationsPushHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java
index 0f8ac611e..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
@@ -136,6 +136,7 @@ public String sendToToken(final String userId, String token, Map<String, Object>
               .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)
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 3d8b055ca..a62354070 100644
--- a/mobile-war/src/main/webapp/WEB-INF/app-sw.template
+++ b/mobile-war/src/main/webapp/WEB-INF/app-sw.template
@@ -24,6 +24,9 @@ if (firebaseConfig != null) {
      const pushData = event.notification.data;
      event.notification.close();
      if (!pushData["permalink"].endsWith("/null")) {
+      fetch('/silverpeas/services/mobile/notification/readed/' + pushData["notificationId"], {
+        method: 'PUT'
+      });
       event.waitUntil(self.clients.openWindow(pushData["permalink"]));
      }
   });

From 7749e169cb1aff9fb898774d4064a059d42df915 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 29 Nov 2023 16:47:12 +0100
Subject: [PATCH 090/228] Fix service worker initialisation

---
 .../src/main/webapp/WEB-INF/app-init.template | 22 ++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)

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 e5fc4b19f..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,18 +5,20 @@ 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");
-          }
         });
       });
 

From cda2254680a2de3f553d3cc2c0543531f381508e Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 29 Nov 2023 23:52:20 +0100
Subject: [PATCH 091/228] Update dependency on Silverpeas to version
 6.4-JR-build231129

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 2ceaf0cbb..830bea3c8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231122</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231129</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From dc64993466d25beb175d851760fd79389e23e01c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 1 Dec 2023 14:59:24 +0100
Subject: [PATCH 092/228] Fix #13875

---
 .../common/AuthentificationManager.java       |  3 +-
 .../server/services/ServiceNavigation.java    | 29 ++------
 .../server/services/helpers/NewsHelper.java   | 70 ++++++++++++-------
 3 files changed, 52 insertions(+), 50 deletions(-)

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 176d8d1cf..b61eec14b 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
@@ -264,7 +264,8 @@ public void onSuccess(final Method method, final Boolean showTermsOfServices) {
 
                 @Override
                 public void onFailure(final Method method, final Throwable t) {
-                  GWT.log("Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage(), t);
+                  //super.onFailure(method, t);
+                  GWT.log("Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage());
                   if (t instanceof AuthenticationException) {
                     EventBus.getInstance().fireEvent(new AuthenticationErrorEvent(t));
                   } else {
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 fea109d7b..a277f1aa2 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;
@@ -248,11 +231,7 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
       } 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);
-      }
-
+      List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId, maxNews);
       data.setNews(NewsHelper.getInstance().populate(lastNews, false));
 
       if (spaceId == null || spaceId.isEmpty()) {
@@ -490,7 +469,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()) {
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 8e2c2336c..74fecaf74 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
@@ -38,17 +38,11 @@
 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;
 
@@ -76,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) {
@@ -102,15 +96,15 @@ 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);
+            news = getNewsByComponentId(newsSource, false, userId, maxNews);
+            news = sortAndTruncate(maxNews, news);
           } else if (newsSource.trim().equals("*")) {
-            news = getAllNews(userId);
+            news = getAllNews(userId, maxNews);
+            news = sortAndTruncate(maxNews, news);
           } else {
-            news = getDelegatedNews(userId);
+            news = getDelegatedNews(userId, maxNews);
           }
       }
-      Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate()));
-      Collections.reverse(news);
       return news;
     }
   }
@@ -119,22 +113,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) {
-      if (delegated.isValidated() && (delegated.getBeginDate() != null && now.after(delegated.getBeginDate()))
-              && (delegated.getEndDate() != null && now.before(delegated.getEndDate()))) {
-        News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId());
-        if (aNews.canBeAccessedBy(u)) news.add(aNews);
+      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;
@@ -147,19 +158,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);
 
     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<>();
 
@@ -170,6 +181,17 @@ private List<News> getNewsByComponentId(String appId, boolean managerAccess, Str
         news = service.getVisibleNews(appId);
       }
     }
+    news = sortAndTruncate(maxNews, news);
+
+    return news;
+  }
+
+  private static List<News> sortAndTruncate(int maxNews, List<News> news) {
+    Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate()));
+    //Collections.reverse(news);
+    if (news != null && news.size() > maxNews) {
+      news = news.subList(0, maxNews);
+    }
     return news;
   }
 

From 4daf5ab8bda386a3b250759ad9b4d01f487b89a6 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 3 Dec 2023 23:37:55 +0100
Subject: [PATCH 093/228] Update dependency on Silverpeas to version
 6.4-JR-build231203

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 830bea3c8..144f25bb1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231129</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231203</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 5face3a5bc919c8bbcd41e93b2519657273801e8 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 6 Dec 2023 12:18:38 +0100
Subject: [PATCH 094/228] Fix #13885

---
 .../silverpeas/mobile/server/services/ServiceNavigation.java    | 2 +-
 .../silverpeas/mobile/server/services/helpers/NewsHelper.java   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

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 a277f1aa2..6673576be 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
@@ -229,7 +229,7 @@ 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);
+        maxNews = settings.getInteger("space.homepage.news.nb", 3);
       }
       List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId, maxNews);
       data.setNews(NewsHelper.getInstance().populate(lastNews, false));
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 74fecaf74..1d656df19 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
@@ -84,7 +84,7 @@ public List<News> getLastNews(String userId, String spaceId, int maxNews) throws
       for (String appId : appIds) {
         news.addAll(service.getVisibleNews(appId));
       }
-      Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate()));
+      news = sortAndTruncate(maxNews, news);
       return news;
     } else {
       // News on main page

From 11c8082701d8f63dd12bbe8c79a4ecbe682f5f1c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 6 Dec 2023 14:52:28 +0100
Subject: [PATCH 095/228] Feature #13886

---
 .../org/silverpeas/mobile/mobileSettings.properties        | 4 ++++
 .../mobile/server/services/ServiceNavigation.java          | 7 +++++--
 2 files changed, 9 insertions(+), 2 deletions(-)

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 b8d0277dc..49be9befa 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
@@ -25,6 +25,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 +35,8 @@ 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
 
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 6673576be..4662afc91 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
@@ -231,8 +231,11 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
       } else {
         maxNews = settings.getInteger("space.homepage.news.nb", 3);
       }
-      List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId, maxNews);
-      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 =

From de77add944916ba1711670482b995fbce3e97b13 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 6 Dec 2023 15:35:56 +0100
Subject: [PATCH 096/228] Allow url pattern /silverpeas/FileServer/thumbnail/*

---
 .../java/org/silverpeas/bridge/MobilFilter.java     | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

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 28e25b71e..ca5f85722 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -105,12 +105,13 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
       boolean redirect = isRedirect(url);
 
       if (isMobile && !url.contains("sso") && !url.contains("services") &&
-          !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") && 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("FileServer/thumbnail") && redirect) {
         String params = "";
         if (url.contains("Publication")) {
           String id = url.substring(url.lastIndexOf("/") + 1);

From e21861f39668435869c79721714cf8aaca23db81 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 7 Dec 2023 16:37:33 +0100
Subject: [PATCH 097/228] Feature #13883

---
 .../mobile/mobileSettings.properties          |  6 ++
 .../org/silverpeas/mobile/client/SpMobil.java | 19 ++++-
 .../common/AuthentificationManager.java       | 10 +--
 .../client/pages/cookies/CookiesPage.java     | 81 +++++++++++++++++++
 .../client/pages/cookies/CookiesPage.ui.xml   | 47 +++++++++++
 .../client/resources/ApplicationMessages.java |  7 ++
 .../ApplicationMessages_en.properties         |  3 +-
 .../ApplicationMessages_fr.properties         |  3 +
 .../org/silverpeas/mobile/public/spmobile.css | 26 ++++++
 9 files changed, 191 insertions(+), 11 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/pages/cookies/CookiesPage.ui.xml

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 49be9befa..16f4ed702 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
@@ -17,6 +17,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
 
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 2576e504e..0ba2c68c0 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
@@ -84,6 +84,7 @@
 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;
@@ -181,7 +182,7 @@ public void onModuleLoad() {
 
     SSO = !ResourcesManager.getSSOPath().isEmpty();
 
-    loadIds(null);
+    displayFirstPage();
 
     NodeList<Element> tags = Document.get().getElementsByTagName("meta");
     for (int i = 0; i < tags.getLength(); i++) {
@@ -226,6 +227,16 @@ public void onResize(final ResizeEvent resizeEvent) {
     apps.add(new ResourcesManagerApp());
   }
 
+  public void displayFirstPage() {
+    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();
@@ -308,6 +319,12 @@ public static void displayTermsOfServicePage() {
     SpMobil.getMainPage().setContent(new TermsOfServicePage());
   }
 
+  public static void displayCookiesPage() {
+    RootPanel.get().clear();
+    RootPanel.get().add(getMainPage());
+    SpMobil.getMainPage().setContent(new CookiesPage());
+  }
+
   /**
    * Load ids in SQL Web Storage.
    */
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 b61eec14b..3e3895d57 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
@@ -32,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;
@@ -45,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;
@@ -306,13 +304,9 @@ 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) {
 
@@ -343,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/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..324fac6ef
--- /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-cookies-title"><ui:safehtml from="{msg.informationTitle}"/></h1>
+    </div>
+
+    <div id="page-cookies" class="ui-content ui-body-a">
+      <div class="cookiesTextContainer">
+        <g:HTML ui:field="text" styleName="cookiesText"></g:HTML>
+        <div class="cookiesTextActions">
+          <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/resources/ApplicationMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java
index 7dd15b073..973ec005c 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 &gt; Ecran de connexion")
   SafeHtml loginTitle();
 
+  @DefaultMessage("Information")
+  SafeHtml informationTitle();
+
   @DefaultMessage("Confirmer")
   String confirmBtnLabel();
   @DefaultMessage("Annuler")
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 3948f3666..aba5d7837 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,10 +22,11 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
+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 &gt; Login screen
-
+informationTitle=Information
 confirmBtnLabel=Confirm
 cancelBtnLabel=Cancel
 correctBtnLabel=Correct
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 2b050fc99..6ae51b51e 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,9 +22,12 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
+cookiesInformation=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 &gt; Ecran de connexion
+informationTitle=Information
 confirmBtnLabel=Confirmer
 cancelBtnLabel=Annuler
 correctBtnLabel=Corriger
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..19547fdc9 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
@@ -1480,6 +1480,7 @@ input.filter-contacts {
   color: #fff !important;
   text-decoration: none;
   display: block;
+  font-weight: bold;
 }
 
 .btn-validate.smaller {
@@ -2716,4 +2717,29 @@ a.popin-btn {
 
 #sharing .label {
   padding-top: 1em;
+}
+
+/**** Cookies information page ****/
+.cookiesTextContainer {
+  background-color: white;
+  height: 25vh;
+  padding: 2em;
+  margin-left: 1em;
+  margin-right: 1em;
+  margin-top: 2em;
+  border-radius: 0.25em;
+}
+
+.cookiesText {
+  height: 20vh;
+  text-align: justify;
+  line-height: 1.2em;
+}
+.cookiesTextActions {
+  text-align: right;
+}
+
+#header #page-cookies-title {
+  left: 1em;
+  right: 1em;
 }
\ No newline at end of file

From af7692c9ba52eb22605dc2c4d1ac69aed5750ff0 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 7 Dec 2023 16:56:09 +0100
Subject: [PATCH 098/228] Fix french text

---
 .../silverpeas/mobile/client/resources/ApplicationMessages.java | 2 +-
 .../mobile/client/resources/ApplicationMessages_fr.properties   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

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 973ec005c..8e145a6b5 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
@@ -30,7 +30,7 @@
 
 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.")
+  @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")
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 6ae51b51e..61834200d 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,7 +22,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-cookiesInformation=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.
+cookiesInformation=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

From d40549914013d1c3bbe08367bce0fe9a3bcbf890 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 7 Dec 2023 17:59:03 +0100
Subject: [PATCH 099/228] improve login page

---
 .../org/silverpeas/mobile/public/spmobile.css   | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

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 19547fdc9..0d1ddbc22 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
@@ -1570,15 +1570,18 @@ textarea.ui-input-text {
 
 #formLogin {
   text-align: center;
-  padding-top: 1em;
+  padding-top: 4em;
 }
 
 #page-login #Login, #page-login #Password {
   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 {
@@ -1586,11 +1589,11 @@ textarea.ui-input-text {
 }
 
 #page-login #DomainId {
-  width: 237px;
+  width: 70vw;
 }
 
 #page-login #password-visibility {
-  margin-bottom: 1em;
+  margin-bottom: 1.5em;
 }
 
 #page-login #copyright {
@@ -1605,7 +1608,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
 }
 

From e1a669f982b41b63089b8f5b22738a748f083a55 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 8 Dec 2023 11:59:36 +0100
Subject: [PATCH 100/228] improve notification message

---
 .../server/UserNotificationServerEventMobileListener.java     | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

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 5dc7d34e7..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
@@ -54,7 +54,9 @@ public void on(final UserNotificationServerEvent event) {
       String id = (String) data.get("id");
       if (Boolean.TRUE.equals(isCreation)) {
         SILVERMAILMessage msg =  SILVERMAILPersistence.getMessage(event.getEmitterUserId(), Long.valueOf(id));
-        data.put("body", Jsoup.parse(msg.getBody()).wholeText());
+        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);
       }

From 7e4b3bf2ae33890708b770815d38d8f9dbdcedc5 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 8 Dec 2023 16:05:39 +0100
Subject: [PATCH 101/228] Login page improvement

---
 .../main/java/org/silverpeas/mobile/public/spmobile.css    | 7 +++++++
 1 file changed, 7 insertions(+)

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 0d1ddbc22..fcfdfa8a4 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
@@ -1574,6 +1574,7 @@ textarea.ui-input-text {
 }
 
 #page-login #Login, #page-login #Password {
+  box-sizing: border-box;
   background: #FFF url(bg-input-login.png) 0 0 no-repeat;
   padding-left: 2em;
   border: 1px solid #dddddd;
@@ -1590,6 +1591,12 @@ textarea.ui-input-text {
 
 #page-login #DomainId {
   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);
 }
 
 #page-login #password-visibility {

From df4778cadd849d4f4a23c5865d77f50a8631ca15 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 13 Dec 2023 14:53:26 +0100
Subject: [PATCH 102/228] fix label cookies

---
 .../mobile/client/resources/ApplicationMessages_en.properties   | 2 +-
 .../mobile/client/resources/ApplicationMessages_fr.properties   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

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 aba5d7837..1c378d1cb 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,7 +22,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-For its operation, this application uses cookies. The stored information is solely technical and does not contain personal data or tracking information.
+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 &gt; Login screen
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 61834200d..1fb8cc8ea 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,7 +22,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-cookiesInformation=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.
+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

From 07de4ea65c3dc94c001d61556a7b14ac9d7fc542 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 13 Dec 2023 17:41:41 +0100
Subject: [PATCH 103/228] Fix #13889

---
 .../server/services/ServiceContact.java       | 28 ++++++++++---------
 1 file changed, 15 insertions(+), 13 deletions(-)

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..c30596ee0 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.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);
         for (String prop : getUserProperties()) {
           dto.addProperty(prop, userFull.getValue(prop));
         }

From 46357cf57b261af40e6283feed0b614381fb250f Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 14 Dec 2023 12:09:12 +0100
Subject: [PATCH 104/228] improve login design

---
 .../client/pages/connexion/ConnexionPage.java | 13 ++---
 .../pages/connexion/ConnexionPage.ui.xml      |  3 +-
 .../client/resources/ApplicationMessages.java |  4 --
 .../ApplicationMessages_en.properties         |  1 -
 .../ApplicationMessages_fr.properties         |  1 -
 .../silverpeas/mobile/public/components.css   | 51 +++++++++++++++++++
 .../org/silverpeas/mobile/public/spmobile.css |  2 +
 7 files changed, 59 insertions(+), 16 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/components.css

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..d4a81fb4c 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
@@ -31,13 +31,7 @@
 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 +66,9 @@ public class ConnexionPage extends PageContent {
   @UiField
   CheckBox tooglePasswordView;
 
+  @UiField
+  InlineHTML labelTooglePasswordView;
+
   public void setAuthenticateError(final AuthenticationException authenticateError) {
     if (authenticateError == null) {
       checkCredentials("init","init");
@@ -140,10 +137,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..78ac985a6 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">
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 8e145a6b5..8063e7e6f 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
@@ -186,10 +186,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();
 
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 1c378d1cb..1cd6f4c6a 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
@@ -78,7 +78,6 @@ notifications=My notifications
 pwdNotValid=Password is not valid
 
 showPwd=Show password
-hidePwd=Hide password
 
 received=Received
 sended=Sended
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 1fb8cc8ea..53763656e 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
@@ -83,7 +83,6 @@ 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
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..c238d74c3
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
@@ -0,0 +1,51 @@
+
+/** Checkbox **********************************************************************************************************/
+
+.checkbox-wrapper {
+    display : inline-grid;
+    vertical-align : middle;
+}
+
+.checkbox-wrapper input[type=checkbox] {
+    height: 0;
+    width: 0;
+    display: none;
+}
+
+.checkbox-wrapper label {
+    --size: 50px;
+
+    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%;
+}
\ No newline at end of file
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 fcfdfa8a4..4fa6fc4a4 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,6 +22,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+@import "components.css";
+
 /* Globals */
 /* Font
 -----------------------------------------------------------------------------------------------------------*/

From 1202a50088fd558433beb99f8c02af0416bf3262 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 18 Dec 2023 11:31:06 +0100
Subject: [PATCH 105/228] Fix permalink in wysiwyg content

---
 .../client/apps/navigation/NavigationApp.java | 29 +++++++++++++++----
 .../server/services/ServiceNavigation.java    | 17 +++++++++++
 .../servlets/PublicationContentServlet.java   |  7 +++++
 .../services/rest/ServiceNavigation.java      |  6 ++++
 4 files changed, 54 insertions(+), 5 deletions(-)

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 d2a4fad8a..9e5d6b709 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
@@ -25,7 +25,9 @@
 package org.silverpeas.mobile.client.apps.navigation;
 
 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.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 +39,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 {
 
@@ -100,10 +105,24 @@ 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().getInstanceId());
-      page.show();
-    }
+      if (event.getContent().getType().equals(ContentsTypes.Space.name())) {
+          MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<SpaceDTO>() {
+              @Override
+              public void attempt() {
+                  ServicesLocator.getServiceNavigation().getSpace(event.getContent().getInstanceId(), 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(event.getContent().getInstanceId());
+                      page.show();
+                  }
+              }
+          };
+          action.attempt();
+      }
   }
 }
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 4662afc91..6c010a204 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
@@ -231,6 +231,7 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
       } else {
         maxNews = settings.getInteger("space.homepage.news.nb", 3);
       }
+
       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);
@@ -463,6 +464,22 @@ public Boolean isWorkflowApp(@PathParam("instanceId") String intanceId) {
     }
   }
 
+  @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)
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..057d6ad9e 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
@@ -185,6 +185,13 @@ private void displayWysiwyg(String html, HttpServletRequest request, HttpServlet
       }
       img.attr("src", newSource);
     }
+    Elements anchors = doc.getElementsByTag("a");
+    for (Element a : anchors) {
+      String target = a.attr("target");
+      if (!target.equalsIgnoreCase("_blank")) {
+        a.attr("target", "_top");
+      }
+    }
 
     html = doc.outerHtml();
     OutputStreamWriter out = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
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..b95b56d41 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,11 @@
 @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("spacesAndApps/{rootSpaceId}/")

From 295fb8cc07dd432450463d862b7914d42a11df7c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 19 Dec 2023 12:00:13 +0100
Subject: [PATCH 106/228] Feature #13901

---
 .../java/org/silverpeas/mobile/client/SpMobil.java     |  5 +++++
 .../mobile/client/apps/navigation/NavigationApp.java   |  4 +++-
 .../mobile/client/common/navigation/LinksManager.java  | 10 +++++++++-
 .../server/servlets/PublicationContentServlet.java     |  6 +++++-
 mobile-war/src/main/webapp/spmobile/spmobil.jsp        |  3 +++
 5 files changed, 25 insertions(+), 3 deletions(-)

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 0ba2c68c0..5eae9a551 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
@@ -145,6 +145,7 @@ public static void setUser(final DetailUserDTO user) {
    * Init. spmobile.
    */
   public void onModuleLoad() {
+    exportNativeFunctions();
     // init connexion supervision
     NetworkHelper.getInstance();
 
@@ -556,4 +557,8 @@ public static Config getConfiguration() {
   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(*));
+  }-*/;
 }
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 9e5d6b709..e8878068d 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
@@ -109,7 +109,9 @@ public void showContent(final NavigationShowContentEvent event) {
           MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<SpaceDTO>() {
               @Override
               public void attempt() {
-                  ServicesLocator.getServiceNavigation().getSpace(event.getContent().getInstanceId(), this);
+                  String id = event.getContent().getInstanceId();
+                  if (id == null || id.isEmpty()) id = event.getContent().getId();
+                  ServicesLocator.getServiceNavigation().getSpace(id, this);
               }
               @Override
               public void onSuccess(Method method, SpaceDTO space) {
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 9bb409b64..18e098104 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
@@ -44,6 +44,14 @@ public class LinksManager {
 
   private static Boolean iosShowIframe = Boolean.parseBoolean(ResourcesManager.getParam("ios.link.open.in.iframe"));
 
+  public static void navigateToPermalink(String url) {
+    HyperLinkDTO dto = new HyperLinkDTO();
+    dto.setUrl(url);
+    dto.setInternalLink(true);
+    dto.setOpenNewWindow(false);
+    processLink(dto);
+  }
+
   public static void processLink(HyperLinkDTO hyperLinkDTO) {
     String url = hyperLinkDTO.getUrl();
     if(sameContext(url)) {
@@ -145,4 +153,4 @@ private static void openExternalLinkStandard(String url, boolean openNewWindow,
     }
   }
 
-}
\ No newline at end of file
+}
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 057d6ad9e..083924f12 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
@@ -187,9 +187,13 @@ private void displayWysiwyg(String html, HttpServletRequest request, HttpServlet
     }
     Elements anchors = doc.getElementsByTag("a");
     for (Element a : anchors) {
+      String href = a.attr("href");
       String target = a.attr("target");
       if (!target.equalsIgnoreCase("_blank")) {
-        a.attr("target", "_top");
+        if (href.contains("/silverpeas/") && !href.contains(".jsp")) {
+          a.attr("href", "#");
+          a.attr("onclick", "parent.navigate('" + href + "');");
+        }
       }
     }
 
diff --git a/mobile-war/src/main/webapp/spmobile/spmobil.jsp b/mobile-war/src/main/webapp/spmobile/spmobil.jsp
index 0fd2140b2..3f6e2c4ad 100644
--- a/mobile-war/src/main/webapp/spmobile/spmobil.jsp
+++ b/mobile-war/src/main/webapp/spmobile/spmobil.jsp
@@ -144,6 +144,9 @@
       var windowHeight = window.innerHeight;
       document.body.style.height = windowHeight + "px";
     }
+    function navigate(url) {
+      window.navigateTo(url);
+    }
   </script>
 
   <%

From 3827466b8156be4742054f75c5673b55faea711f Mon Sep 17 00:00:00 2001
From: SilverYoCha <yohann.chastagnier@silverpeas.com>
Date: Tue, 19 Dec 2023 15:04:15 +0100
Subject: [PATCH 107/228] Feature #13861: fixing compilation errors

---
 .../org/silverpeas/mobile/server/services/ServiceContact.java | 2 +-
 .../mobile/server/services/ServiceNotifications.java          | 4 ++--
 .../silverpeas/mobile/server/services/helpers/UserHelper.java | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

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 c30596ee0..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
@@ -327,7 +327,7 @@ private DetailUserDTO populate(Object user) {
         dto.setId(userFull.getId());
         dto.setFirstName(userFull.getFirstName());
         dto.setLastName(userFull.getLastName());
-        dto.seteMail(userFull.geteMail());
+        dto.seteMail(userFull.getEmailAddress());
         dto.setStatus(userFull.getStatus());
         dto.setAvatar(userFull.getAvatar());
         dto.setLanguage(userFull.getUserPreferences().getLanguage());
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 80a06fd02..e29c434cf 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
@@ -289,7 +289,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);
@@ -432,7 +432,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/helpers/UserHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/UserHelper.java
index b151d7f22..a0e2d6b6b 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
@@ -65,7 +65,7 @@ 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());
@@ -97,7 +97,7 @@ 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);

From 3577b37a0ae3dedfcd90b478534df9266e5d890d Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 20 Dec 2023 16:02:03 +0100
Subject: [PATCH 108/228] Feature #13826

---
 .../components/attachments/Attachment.java    | 109 ++++++++++--------
 .../components/attachments/Attachment.ui.xml  |   9 +-
 .../org/silverpeas/mobile/public/download.png | Bin 383 -> 0 bytes
 .../mobile/public/forbidden-download.png      | Bin 555 -> 0 bytes
 .../mobile/public/icons/arrow_forward.svg     |  31 +++++
 .../mobile/public/icons/download.svg          |   1 +
 .../mobile/public/icons/expand_less.svg       |   1 +
 .../mobile/public/icons/expand_more.svg       |   1 +
 .../silverpeas/mobile/public/icons/share.svg  |   1 +
 .../silverpeas/mobile/public/icons/view.svg   |   1 +
 .../java/org/silverpeas/mobile/public/qvf.png | Bin 272 -> 0 bytes
 .../java/org/silverpeas/mobile/public/qvf.svg |  42 +++++++
 .../org/silverpeas/mobile/public/spmobile.css |  83 +++++++++----
 13 files changed, 205 insertions(+), 74 deletions(-)
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/download.png
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/forbidden-download.png
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_forward.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/download.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_less.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/expand_more.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/share.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/view.svg
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.png
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/qvf.svg

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 b7bb7612b..fd631e6f0 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,15 +35,10 @@
 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.common.Notification;
 import org.silverpeas.mobile.client.common.mobil.MobilUtils;
 import org.silverpeas.mobile.client.common.navigation.UrlUtils;
@@ -52,18 +47,23 @@
 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;
 
 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;
 
+  @UiField
+  HTMLPanel operations;
+
+  @UiField
+  HTML share, view;
+
   protected DocumentsResources ressources = null;
   private DocumentsMessages msg = null;
   private ApplicationMessages globalMsg = null;
@@ -94,10 +94,15 @@ public void setAttachment(SimpleDocumentDTO data) {
   }
 
   private void render() {
+    operations.getElement().setId("operations");
+    view.getElement().setId("view");
+    share.getElement().setId("share");
+    download.getElement().setId("download");
+
     Image img = null;
     String sizeValue;
     if (!data.isDownloadable()) {
-      link.setStylePrimaryName("not-downloadable");
+      download.setVisible(false);
     }
     if (data.getSize() < 1024 * 1024) {
       sizeValue = String.valueOf(data.getSize() / 1024);
@@ -148,54 +153,29 @@ private void render() {
       } else {
         url = "#";
       }
-      link.setHref(url);
-      if (MobilUtils.isIOS()) {
-        if (data.isDownloadable()) {
-          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");
-            }
-          });
-        } else {
-          link.addClickHandler(new ClickHandler() {
-            @Override
-            public void onClick(final ClickEvent clickEvent) {
-              viewDocument();
-            }
-          });
-        }
-      } else {
-        if (data.isDownloadable()) {
-          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());
-              }
-            }
-          });
-        } else {
-          link.addClickHandler(new ClickHandler() {
-            @Override
-            public void onClick(final ClickEvent clickEvent) {
-              viewDocument();
-            }
-          });
+      download.setHref(url);
+      link.addClickHandler(new ClickHandler() {
+        @Override
+        public void onClick(ClickEvent clickEvent) {
+          toogleOperations();
         }
-      }
+      });
     } 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 void viewDocument() {
     IframePage page = new IframePage("/silverpeas/services/media/viewer/embed/pdf?documentId="+data.getId()+"&documentType=attachment&language="+data.getLang()+"&embedPlayer=true");
     page.show();
@@ -206,6 +186,35 @@ protected void share(ClickEvent event) {
     SharingPage page = new SharingPage();
     page.setData("Attachment", data.getSpId(), data.getInstanceId());
     page.show();
+  }
+
+  @UiHandler("download")
+  protected void download(ClickEvent event) {
+    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) {
+    viewDocument();
   }
 }
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..aa51c83b8 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,16 @@
 <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">
+    <g:Anchor ui:field="link" styleName="expand-more" href="#">
       <img ui:field="icon" src=""/>
       <span ui:field="name"></span><span ui:field="size" class="weight"></span>
       <span ui:field="description"></span>
     </g:Anchor>
-    <g:Anchor ui:field="share" styleName="share">
+    <g:HTMLPanel ui:field="operations" stylePrimaryName="ops-closed">
+      <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/public/download.png b/mobile-war/src/main/java/org/silverpeas/mobile/public/download.png
deleted file mode 100644
index 5b3c0cf543922ebf4870a741085000b2d7f0e82d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 383
zcmV-_0f7FAP)<h;3K|Lk000e1NJLTq000XB000XJ1^@s6sjPP<0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzAxT6*RCwBCk-ch#Pz=Z8SD|v%4%bQO
z6S(yOgm!76OW(k`;Nb2k2wfZ;y1I7h)S)1hK0seV9Yl0&@q(XdlLHDD1K}h&znp)<
z;g)3qvN(=4Jbqzsf3|I3Q6R3BX_`P3MX)Suqj;W&BuTdX3?`MPX;{v297vMH>N|KG
zN0{ds`o7;_YNq-Q9)<w~K{$ig`UVF<pyPRseozzzx~|(`ni*jMnH#nP%AC+&WLf^!
zG>yUJZQC+8P4l3t>JKtc9L?o<-X%7E=(>Ju7{(?`3)XcFMNz!^zW>Zq5rY=x9?P=)
z%=4VhO|xcM25FkUVeGKc)=wdGU6&NzkH_OZy;@b(7v>LP7!Es_%yFCxYCxyO@1iI=
dt#|(d3;_GvkgyWsRXzX!002ovPDHLkV1gCoqe1`x

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 08b80dd3d10663fd6a0dd00f7e9dd013caea1b17..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 555
zcmV+`0@VG9P)<h;3K|Lk000e1NJLTq000jF000XJ1^@s6phwqS0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz%}GQ-RCwBiQ9VdoQ562(GtbyK=nE}L
zD2R)tqNRg~(lw$PEOxYmn9ZSGBA5z=bm}5X76~{t#igPsluGL&4Lk(9hz<n_>X4s8
zitwI^x$pma?}J2(70=;t4j=cs=R4;Jlu~fZX0shEskm)gJRa}-4-Q|Wux%TXBq17&
z!m_L;mdoXEm;FN)1OfGW9lEZ2nBzDeelNMv%`{CIhS4N*{O{^4^%e4<E=60<5a#pW
zgvD1&*JMuO^Yh0y$*=!>?Vx!THd~FS?EE|4i9V`j-gLM4{r*RaqV%$dU9v34S%47Y
z$?gBW4(s$7{(&*bbDv;pDvXmO2qqgxCr?Dysm5X<7!3Xlhr`X8d62^c=)^(i^arS4
z(m3B(LF?d45UmcQYL1AhREjXk<Ap+Dw^%HqTCHA_wM!Tm1eMPVD6MAD9-D$ZISZpk
zKx(EaH13>CCLgf08Hq$<p-{-1zf>w=bY~fCQ+PNrjmI<ZarW^oROJVtJ4%zxEs;og
zA29hb*L6{;RCXu#*M{M`0m^njnG4({$#yTTr{c}KrPFD`7B#`-Z<ovEU%VdLE4K%p
t4Z~?^g+nC-p1*)zBYnM@t&=MO1^^|83O9^}bEN<P002ovPDHLkV1lkP`JVs)

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/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/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/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/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 112b1c0401f14301f9784fb655d59bb6786314e8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 272
zcmeAS@N?(olHy`uVBq!ia0vp^>_9Ba!3HF|e7-mXDajJoh?3y^w370~qErUQl>DSr
z1<%~X^wgl##FWaylc_d9MVmZb978H@CH?vT-@bXxnl-l4(zo68^z`Z!{(ii^KK|cy
z{dl_*hZtCZQpGMVE<cVQJt}EoY58-1{eL@ljWt};Qqt4KS-p%pIy(&+N{tvwyPA&7
zbYL+y{_M3NPv9)W<K~PFehW_B@t<#Zm;F}e;e!VYpB(R(uT>~?o6uaqsK#c~z<O-L
z#EB16Qc|uk8LhXi`}4y(M*YNm2XT9G0Rao<l8?o)v9Z-V&IQ(AIx?Suk&R)(hjjh5
TF^`r5UC-d@>gTe~DWM4f#foWx

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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 4fa6fc4a4..39560249a 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
@@ -162,7 +162,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: " ";
 }
 
@@ -1239,38 +1239,78 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   margin-right: 8px;
 }
 
-#attachments li a.downloadable {
-	background: transparent url(download.png) right 1em no-repeat;
+#attachments li a.expand-more {
+	background: transparent url(icons/expand_more.svg) right 1em no-repeat;
 	display: block;
-	margin-right: 1.5em;
+	margin-right: 0.5em;
+}
+
+#attachments li a.expand-less {
+  background: transparent url(icons/expand_less.svg) right 1em no-repeat;
+  display: block;
+  margin-right: 0.5em;
 }
 
 #shares li {
   width: max-content;
 }
-#shares li a.share-link {
-  background: transparent url(download.png) right 1em no-repeat;
+
+#attachments li a span {
   display: inline-block;
-  width: 10px;
-  height: 24px;
-  margin-right: 1em;
-  margin-left: 1em;
 }
 
-#attachments li a.share {
-  background: transparent url(share.png) right 1em no-repeat;
-  display: block;
+.ops-open, .ops-open #share, .ops-open #download, .ops-open #view {
+  transition: all .25s ease-in-out;
+  color: transparent;
+  height: 30px;
+  line-height:30px;
+  transform: scaleY(1);
+  margin-bottom:10px;
+}
+
+.ops-closed, .ops-closed #share, .ops-closed #download, .ops-closed #view {
+  transition: all .25s ease-in-out;
+  height: 0px;
+  line-height:0px;
+  transform: scaleY(1);
+  margin-bottom: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: 1.5em;
-  margin-bottom: 1em;
+  float : right;
 }
 
-#attachments li a span {
-  display: inline-block;
+#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: 1.5em;
+  float : right;
 }
 
-#attachments li a.not-downloadable {
-  background: transparent url(forbidden-download.png) right 10px no-repeat;
-  display: 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: 1.5em;
+  float : right;
 }
 
 /********** CONTACT *******/
@@ -1923,7 +1963,7 @@ form .forms .fields > li:nth-child(even) {
   text-indent: -3000px;
   top: 1em;
   right: 1em;
-  background: transparent url("qvf.png") 0 0 no-repeat;
+  background: transparent url("qvf.svg") 0 0 no-repeat;
   outline: none;
   z-index: 999;
 }
@@ -2754,4 +2794,5 @@ a.popin-btn {
 #header #page-cookies-title {
   left: 1em;
   right: 1em;
-}
\ No newline at end of file
+}
+

From 05409ae4c8a8fa6ce6c0defec6acafa1847606ec Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 21 Dec 2023 10:59:55 +0100
Subject: [PATCH 109/228] Feature #13826

---
 .../apps/documents/pages/PublicationPage.java |  3 +++
 .../components/attachments/Attachment.java    | 20 +++++++++++++++++--
 .../components/attachments/Attachment.ui.xml  |  1 +
 .../silverpeas/mobile/public/icons/send.svg   |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 15 ++++++++++++--
 .../server/services/ServiceNotifications.java |  6 +++++-
 .../dto/notifications/NotificationDTO.java    |  2 ++
 7 files changed, 43 insertions(+), 5 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/send.svg

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 5f4dadff8..f8a43ea20 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
@@ -74,6 +74,7 @@ public class PublicationPage extends PageContent
   private static PublicationPageUiBinder uiBinder = GWT.create(PublicationPageUiBinder.class);
 
   private PublicationDTO publication;
+  private boolean notifiable;
 
   @UiField
   HeadingElement title;
@@ -162,6 +163,7 @@ public void setPublicationId(String id, String type) {
   public void onLoadedPublication(PublicationLoadedEvent event) {
     Notification.activityStop();
     this.publication = event.getPublication();
+    this.notifiable = event.isNotifiable();
     display(event.isCommentable(), event.isAbleToStoreContent(), event.getType());
     actionsMenu.addAction(favorite);
     if (event.isNotifiable()) {
@@ -195,6 +197,7 @@ public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEve
         attachment.setDownloadable(true);
       }
       Attachment a = new Attachment();
+      a.setNotifiable(this.notifiable);
       a.setAttachment(attachment);
       a.setSharing(event.getShare());
       attachments.add(a);
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 fd631e6f0..e1936759c 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
@@ -39,6 +39,7 @@
 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.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;
@@ -47,6 +48,7 @@
 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.notifications.NotificationDTO;
 
 public class Attachment extends Composite {
 
@@ -62,7 +64,7 @@ public class Attachment extends Composite {
   HTMLPanel operations;
 
   @UiField
-  HTML share, view;
+  HTML share, view, notify;
 
   protected DocumentsResources ressources = null;
   private DocumentsMessages msg = null;
@@ -70,6 +72,14 @@ public class Attachment extends Composite {
   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> {}
 
@@ -87,7 +97,6 @@ public void setSharing(int sharing) {
       share.setVisible(false);
     }
   }
-
   public void setAttachment(SimpleDocumentDTO data) {
     this.data = data;
     render();
@@ -98,6 +107,7 @@ private void render() {
     view.getElement().setId("view");
     share.getElement().setId("share");
     download.getElement().setId("download");
+    notify.getElement().setId("notify");
 
     Image img = null;
     String sizeValue;
@@ -217,4 +227,10 @@ protected void download(ClickEvent event) {
   protected void view(ClickEvent event) {
     viewDocument();
   }
+
+  @UiHandler("notify")
+  protected void notify(ClickEvent event) {
+    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 aa51c83b8..ee43435d2 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
@@ -32,6 +32,7 @@
       <span ui:field="description"></span>
     </g:Anchor>
     <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>
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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 39560249a..11a854f98 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
@@ -1259,7 +1259,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   display: inline-block;
 }
 
-.ops-open, .ops-open #share, .ops-open #download, .ops-open #view {
+.ops-open, .ops-open #share, .ops-open #download, .ops-open #view, .ops-open #notify {
   transition: all .25s ease-in-out;
   color: transparent;
   height: 30px;
@@ -1268,7 +1268,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   margin-bottom:10px;
 }
 
-.ops-closed, .ops-closed #share, .ops-closed #download, .ops-closed #view {
+.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;
@@ -1313,6 +1313,17 @@ li > #operations {
   float : right;
 }
 
+#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: 1.5em;
+  float : right;
+}
+
 /********** CONTACT *******/
 #btn-my-contacts, #btn-all-contacts, #btn-all-contactsext {
   padding-left: 5px;
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 e29c434cf..83347a6f7 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
@@ -409,7 +409,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) ||
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";

From 35a2b619f0ad537ce60ab31c8a3ca85d5facf0bc Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Thu, 21 Dec 2023 11:28:43 +0100
Subject: [PATCH 110/228] Update dependency on Silverpeas to version
 6.4-JR-build231221

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 144f25bb1..376efc165 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231203</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231221</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From eb61ffd51243364d6bfd216afc1aff57009ab065 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 21 Dec 2023 18:09:48 +0100
Subject: [PATCH 111/228] improve main menu

---
 .../mobile/public/icons/calendar.svg          |  1 +
 .../silverpeas/mobile/public/icons/chat.svg   |  1 +
 .../silverpeas/mobile/public/icons/edit.svg   |  1 +
 .../silverpeas/mobile/public/icons/help.svg   |  1 +
 .../silverpeas/mobile/public/icons/home.svg   |  1 +
 .../silverpeas/mobile/public/icons/inbox.svg  |  1 +
 .../silverpeas/mobile/public/icons/logout.svg |  1 +
 .../mobile/public/icons/settings.svg          |  1 +
 .../silverpeas/mobile/public/icons/tasks.svg  |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 35 ++++++++++---------
 10 files changed, 27 insertions(+), 17 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/edit.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/help.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/inbox.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/logout.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/settings.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks.svg

diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar.svg
new file mode 100644
index 000000000..c482b90b9
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar.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/public/icons/chat.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat.svg
new file mode 100644
index 000000000..4ce311b89
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat.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>
\ 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/help.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/help.svg
new file mode 100644
index 000000000..f7ffc5da2
--- /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"/></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..8584f7ebb
--- /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="#000000"><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/inbox.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/inbox.svg
new file mode 100644
index 000000000..ed6363627
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/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/public/icons/logout.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/logout.svg
new file mode 100644
index 000000000..bfd7e2923
--- /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"/></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..e40c8496e
--- /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"/></g></svg>
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks.svg
new file mode 100644
index 000000000..410991a61
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks.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" fill="#000000"><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>
\ No newline at end of file
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 11a854f98..a80f5104d 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
@@ -475,7 +475,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #header h1 {
   color: #fff;
-  font-size: 0.8em;
+  font-size: 1em;
   font-weight: normal;
   left: 60px;
   line-height: 44px;
@@ -703,13 +703,13 @@ 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;
@@ -724,49 +724,50 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   text-decoration: none;
   color: #333333;
   display: block;
-  padding: 0.5em 0 0.5em 32px;
-  font-size: 0.9em;
+  padding: 0.25em 0 0.5em 32px;
+  font-size: 1.25em;
   line-height: 1.6em;
+  margin-left: 0.5em;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-config a {
-  background: transparent url(packPictos.png) 8px -520px no-repeat;
+  background: transparent url('icons/settings.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-tasks a {
-  background: transparent url(packPictos.png) 8px -394px no-repeat;
+  background: transparent url('icons/tasks.svg') 8px -394px no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-help a {
-  background: transparent url(packPictos.png) 8px -134px no-repeat;
+  background: transparent url('icons/help.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-notificationsbox a {
-  background: transparent url(packPictos.png) 8px -515px no-repeat;
+  background: transparent url('icons/inbox.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-sharesbox a {
-  background: transparent url(packPictos.png) 8px -539px no-repeat;
+  background: transparent url('icons/share.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-parameter a {
-  background: transparent url(packPictos.png) 8px -98px no-repeat;
+  background: transparent url('icons/settings.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-home a {
-  background: transparent url(packPictos.png) 8px -25px no-repeat;
+  background: transparent url('icons/home.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-logout a {
-  background: transparent url(packPictos.png) 8px -63px no-repeat;
+  background: transparent url('icons/logout.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-tchat a {
-  background: transparent url(packPictos.png) 8px -276px no-repeat;
+  background: transparent url('icons/chat.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-usercalendar a {
-  background: transparent url(packImagesNavigation.png) -20px -2171px no-repeat;
+  background: transparent url('icons/calendar.svg') no-repeat;
 }
 
 #menu-principal li a strong {
@@ -1959,7 +1960,7 @@ form .forms .fields > li:nth-child(even) {
 }
 
 .content > .ui-listview.ui-listview-inset {
-  padding-top: 3em;
+  padding-top: 3.25em;
 }
 
 .content-navigation {

From 43509f7371f95f205f8771a3e1095864341b91bd Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 22 Dec 2023 18:01:01 +0100
Subject: [PATCH 112/228] Feature #13904 : media app

---
 .../client/apps/documents/DocumentsApp.java   | 16 ++--
 .../mobile/client/apps/media/MediaApp.java    | 66 +++++++--------
 .../apps/media/pages/MediaNavigationPage.java |  6 ++
 .../client/apps/media/pages/PhotoPage.java    |  5 ++
 .../client/apps/media/pages/SoundPage.java    |  5 ++
 .../client/apps/media/pages/VideoPage.java    |  5 ++
 .../apps/media/pages/VideoStreamingPage.java  |  5 ++
 .../mobile/client/common/Html5Utils.java      | 18 ++++
 .../common/navigation/LinksManager.java       | 11 +++
 .../components/base/widgets/ShareButton.java  | 82 +++++++++++++++++++
 .../base/widgets/ShareButton.ui.xml           | 33 ++++++++
 .../client/resources/ApplicationMessages.java |  3 +
 .../ApplicationMessages_en.properties         |  4 +-
 .../ApplicationMessages_fr.properties         |  4 +-
 .../silverpeas/mobile/public/icons/add.svg    |  1 +
 .../org/silverpeas/mobile/public/spmobile.css |  4 +-
 .../mobile/server/services/ServiceMedia.java  | 34 +-------
 .../shared/services/rest/ServiceMedia.java    | 16 +---
 18 files changed, 228 insertions(+), 90 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.ui.xml
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/add.svg

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 07bd6efe4..cbc4e3c97 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
@@ -212,12 +212,16 @@ public void execute() {
         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());
-        }
-      });
+
+      if (event.getContent().getInstanceId().startsWith("kmelia") ||
+              event.getContent().getInstanceId().startsWith("quickinfo")) {
+        loadAppInstance(event.getContent(), new Command() {
+          @Override
+          public void execute() {
+            startWithContent(event.getContent());
+          }
+        });
+      }
     }
   }
 
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 ff28dc6a2..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();
@@ -243,8 +242,8 @@ public void showContent(final NavigationShowContentEvent event) {
         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() {
@@ -268,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..67fe52b3a 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
@@ -42,6 +42,7 @@
 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;
@@ -49,6 +50,7 @@
 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;
@@ -69,6 +71,7 @@ public class MediaNavigationPage extends PageContent implements View, MediaNavig
   private RightDTO rights;
   private AlbumDTO root;
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
+  private ShareButton share = new ShareButton();
 
   interface MediaNavigationPageUiBinder extends UiBinder<Widget, MediaNavigationPage> {
   }
@@ -100,10 +103,13 @@ public void loadedDataEvent(final DataLoadedEvent event) {
       list.add(endline);
 
       actionsMenu.addAction(favorite);
+      actionsMenu.addAction(share);
       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()));
       }
     }
     Notification.activityStop();
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..086741dcb 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
@@ -63,6 +63,7 @@
 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;
@@ -90,6 +91,8 @@ interface PhotoPageUiBinder extends UiBinder<HTMLPanel, PhotoPage> {
   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;
@@ -172,6 +175,8 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) {
         notification.init(photo.getInstance(), photo.getId(), NotificationDTO.TYPE_PHOTO, photo.getName(), getPageTitle());
         actionsMenu.addAction(notification);
       }
+      share.init(photo.getTitle(),photo.getTitle(),"/silverpeas/Media/"+photo.getId());
+      actionsMenu.addAction(share);
     }
   }
 
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..8af2cca05 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,6 +56,7 @@
 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.reconizer.swipe.SwipeEndEvent;
 import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndHandler;
@@ -63,6 +64,7 @@
 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;
@@ -89,6 +91,7 @@ interface SoundPageUiBinder extends UiBinder<HTMLPanel, SoundPage> {
   @UiField ActionsMenu actionsMenu;
 
   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);
@@ -154,6 +157,8 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) {
         notification.init(sound.getInstance(), sound.getId(), NotificationDTO.TYPE_SOUND, sound.getName(), getPageTitle());
         actionsMenu.addAction(notification);
       }
+      share.init(sound.getTitle(),sound.getTitle(), LinksManager.createMediaPermalink(sound.getId()));
+      actionsMenu.addAction(share);
     }
   }
 
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..b3bad79c7 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
@@ -59,6 +59,7 @@
 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.reconizer.swipe.SwipeEndEvent;
 import org.silverpeas.mobile.client.common.reconizer.swipe.SwipeEndHandler;
@@ -66,6 +67,7 @@
 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;
@@ -92,6 +94,7 @@ interface VideoPageUiBinder extends UiBinder<HTMLPanel, VideoPage> {
   @UiField ActionsMenu actionsMenu;
 
   private NotifyButton notification = new NotifyButton();
+  private ShareButton share = new ShareButton();
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
 
   private static VideoPageUiBinder uiBinder = GWT.create(VideoPageUiBinder.class);
@@ -173,6 +176,8 @@ public void onClick(final ClickEvent clickEvent) {
         notification.init(video.getInstance(), video.getId(), NotificationDTO.TYPE_VIDEO, video.getName(), getPageTitle());
         actionsMenu.addAction(notification);
       }
+      share.init(video.getTitle(),video.getTitle(), LinksManager.createMediaPermalink(video.getId()));
+      actionsMenu.addAction(share);
     }
   }
 
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..b1cbf9395 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.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;
@@ -85,6 +87,7 @@ interface VideoStreamingPageUiBinder extends UiBinder<HTMLPanel, VideoStreamingP
   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;
@@ -135,6 +138,8 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) {
         notification.init(video.getInstance(), video.getId(), NotificationDTO.TYPE_STREAMING, video.getName(), getPageTitle());
         actionsMenu.addAction(notification);
       }
+      share.init(video.getTitle(),video.getTitle(), LinksManager.createMediaPermalink(video.getId()));
+      actionsMenu.addAction(share);
     }
   }
 
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 8231e7a0d..01de7117a 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
@@ -167,4 +167,22 @@ public static void onSpeechStop() {
   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/navigation/LinksManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java
index 18e098104..5da0be052 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
@@ -52,6 +52,17 @@ public static void navigateToPermalink(String url) {
     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)) {
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..fee1e8e2b
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.java
@@ -0,0 +1,82 @@
+/*
+ * 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.Window;
+import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.HTMLPanel;
+import org.silverpeas.mobile.client.apps.favorites.resources.FavoritesMessages;
+import org.silverpeas.mobile.client.common.Html5Utils;
+import org.silverpeas.mobile.client.components.base.ActionItem;
+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
+        getElement().getParentElement().removeAttribute("style");
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.ui.xml
new file mode 100644
index 000000000..74291968a
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.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.resources.ApplicationMessages'/>
+
+    <g:HTMLPanel tag="li" ui:field="container" styleName="">
+        <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/resources/ApplicationMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java
index 8063e7e6f..04109afb8 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
@@ -194,4 +194,7 @@ public interface ApplicationMessages extends Messages {
 
   @DefaultMessage("Mes partages")
   String shares();
+
+  @DefaultMessage("Partager")
+  String share();
 }
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 1cd6f4c6a..db07d07f6 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
@@ -82,4 +82,6 @@ showPwd=Show password
 received=Received
 sended=Sended
 
-notfoundError=Ressource not found
\ No newline at end of file
+notfoundError=Ressource not found
+
+share=Share
\ 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 53763656e..b69627d60 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
@@ -87,4 +87,6 @@ showPwd=Afficher 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
\ 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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index a80f5104d..b7dee4cd9 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
@@ -756,6 +756,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-home a {
   background: transparent url('icons/home.svg') no-repeat;
+
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-logout a {
@@ -817,8 +818,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 .ui-listview > li.add-media a::after,
 .ui-listview > li.add-task a::after {
-  background-position: right -599px;
-  width: 3em;
+  background: transparent url('icons/add.svg') no-repeat;
 }
 
 .publication.ui-input-text {
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 c8d846b16..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));
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 5ef688498..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)

From 007974b9205a4f9c5caee776555741a3c2d7544d Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 24 Dec 2023 23:35:33 +0100
Subject: [PATCH 113/228] Update dependency on Silverpeas to version
 6.4-JR-build231224

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 376efc165..602741874 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231221</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231224</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 44a9f0d3a4231cc4cd5695fd230e46eb611d9465 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 27 Dec 2023 11:40:29 +0100
Subject: [PATCH 114/228] animate menu

---
 .../components/base/NavigationMenu.java       |  16 +--
 .../mobile/client/components/base/Page.java   |   1 +
 .../client/components/base/PageHeader.java    |  23 ++-
 .../client/components/base/PageHeader.ui.xml  |   9 +-
 .../silverpeas/mobile/public/components.css   | 132 ++++++++++++++++++
 .../org/silverpeas/mobile/public/spmobile.css |  25 ----
 6 files changed, 165 insertions(+), 41 deletions(-)

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..2baf2470c 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
@@ -160,7 +160,7 @@ protected void searchIos(ClickEvent event) {
   @UiHandler("home")
   protected void goHome(ClickEvent event) {
     goHome();
-    closeMenu();
+    SpMobil.getMainPage().closeMenu();
   }
 
   static void goHome() {
@@ -178,7 +178,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,31 +186,31 @@ 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();
   }
 
@@ -220,7 +220,7 @@ protected void calendar(ClickEvent event) {
     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/Page.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/Page.java
index c6f6312ca..05d596566 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
@@ -83,6 +83,7 @@ public void toogleMenu() {
 
   public void closeMenu() {
     menu.closeMenu();
+    header.closeMenuButton();
   }
 
   public void setUser(DetailUserDTO user) {
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..32e20dcac 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;
@@ -48,8 +45,9 @@ 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(provided = true) protected ApplicationMessages msg = null;
   protected ApplicationResources ressources = null;
 
@@ -60,13 +58,12 @@ public PageHeader() {
     header.getElement().setId("header");
     menu.getElement().setId("menu");
     ressources.css().ensureInjected();
-
     title.setInnerText(ResourcesManager.getLabel("mainpage.title"));
   }
 
-
   @UiHandler("menu")
   void onMenu(ClickEvent event) {
+    toogleMenuButton();
     SpMobil.getMainPage().toogleMenu();
   }
 
@@ -75,6 +72,18 @@ void onBack(ClickEvent event) {
     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());
   }
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..c14640182 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
@@ -28,7 +28,14 @@
   <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>
+
     <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}"/>
   </g:HTMLPanel>
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
index c238d74c3..ec7120dd4 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
@@ -48,4 +48,136 @@
 
 .checkbox-wrapper label:active:after {
     width: 55%;
+}
+
+/** Menu **************************************************************************************************************/
+
+#header > .box {
+    border-radius: 2px;
+    position: absolute;
+    left:9px;
+    top:9px;
+    width: 35px;
+    height: 35px;
+}
+
+
+#header > div > div > span {
+    display: block;
+    width: 100%;
+    box-shadow: 0 2px 10px 0 rgba(0,0,0,0.3);
+    border-radius: 2em;
+    height: 5px;
+    background: #fff;
+    transition: all .3s;
+    position: relative;
+}
+
+#header > div > div > span + span {
+    margin-top: 7px;
+}
+
+.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: 12px;
+        transform: rotate(0);
+    }
+    100% {
+        top: 12px;
+        transform: rotate(45deg);
+    }
+}
+
+@keyframes top-2 {
+    0% {
+        top: 12px;
+        transform: rotate(45deg);
+    }
+    50% {
+        top: 12px;
+        transform: rotate(0deg);
+    }
+    100% {
+        top: 0;
+        transform: rotate(0deg);
+    }
+}
+
+@keyframes bottom {
+    0% {
+        bottom: 0;
+        transform: rotate(0);
+    }
+    50% {
+        bottom: 12px;
+        transform: rotate(0);
+    }
+    100% {
+        bottom: 12px;
+        transform: rotate(135deg);
+    }
+}
+
+@keyframes bottom-2 {
+    0% {
+        bottom: 12px;
+        transform: rotate(135deg);
+    }
+    50% {
+        bottom: 12px;
+        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);
+    }
 }
\ No newline at end of file
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 b7dee4cd9..49d72339a 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
@@ -489,31 +489,6 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   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;
-}
-
 .ui-btn-right.back {
   background: #4c4c4c url(bg-degrade.png) bottom center repeat-x;
   color: #FFF;

From d088dc3b6c0bba6f1b18c51eaa919eb53d16b9b9 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 27 Dec 2023 14:36:18 +0100
Subject: [PATCH 115/228] fix post display

---
 .../java/org/silverpeas/mobile/client/apps/blog/BlogApp.java | 5 ++---
 .../mobile/client/apps/blog/pages/widgets/BlogItem.java      | 1 +
 .../mobile/client/apps/documents/DocumentsApp.java           | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

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/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/documents/DocumentsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java
index cbc4e3c97..5ad48dff1 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
@@ -212,9 +212,9 @@ public void execute() {
         event.getContent().getType().equals(ContentsTypes.News.name()) ||
         event.getContent().getType().equals(ContentsTypes.Attachment.name()) ||
         event.getContent().getType().equals(ContentsTypes.Folder.name())) {
-
       if (event.getContent().getInstanceId().startsWith("kmelia") ||
-              event.getContent().getInstanceId().startsWith("quickinfo")) {
+              event.getContent().getInstanceId().startsWith("quickinfo") ||
+              event.getContent().getInstanceId().startsWith("blog")) {
         loadAppInstance(event.getContent(), new Command() {
           @Override
           public void execute() {

From a6ba2677dba2f3454bb370edc011be9b9580f216 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 27 Dec 2023 15:48:08 +0100
Subject: [PATCH 116/228] Feature #13904

---
 .../silverpeas/mobile/client/apps/blog/pages/BlogPage.java   | 5 +++++
 .../silverpeas/mobile/client/apps/news/pages/NewsPage.java   | 5 +++++
 2 files changed, 10 insertions(+)

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..949cf2b53 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,11 @@
 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;
 
@@ -67,6 +69,7 @@ public class BlogPage extends PageContent implements BlogPagesEventHandler {
   ListBox categories;
 
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
+  private ShareButton share = new ShareButton();
   private String instanceId;
 
   interface BlogPageUiBinder extends UiBinder<Widget, BlogPage> {
@@ -131,6 +134,8 @@ public int compare(Map.Entry<String, String> o1,
 
     actionsMenu.addAction(favorite);
     favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), getPageTitle());
+    actionsMenu.addAction(share);
+    share.init(getPageTitle(), getPageTitle(), LinksManager.createApplicationPermalink(instanceId));
   }
 
   @UiHandler("categories")
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..39f1caafe 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,11 @@
 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;
 
@@ -53,6 +55,7 @@ public class NewsPage extends PageContent implements NewsPagesEventHandler {
   @UiField ActionsMenu actionsMenu;
 
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
+  private ShareButton share = new ShareButton();
   private String instanceId;
 
   interface NewsPageUiBinder extends UiBinder<Widget, NewsPage> {
@@ -87,6 +90,8 @@ public void onNewsLoad(final NewsLoadedEvent event) {
     }
     actionsMenu.addAction(favorite);
     favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), getPageTitle());
+    actionsMenu.addAction(share);
+    share.init(getPageTitle(), getPageTitle(), LinksManager.createApplicationPermalink(instanceId));
   }
 
 }
\ No newline at end of file

From 8fb78995d32e3ac8c84b92be3fdb86ff02643639 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 27 Dec 2023 16:13:17 +0100
Subject: [PATCH 117/228] adjust menu

---
 .../silverpeas/mobile/public/components.css   | 30 +++++++++----------
 1 file changed, 15 insertions(+), 15 deletions(-)

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
index ec7120dd4..9efc575c0 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
@@ -55,10 +55,10 @@
 #header > .box {
     border-radius: 2px;
     position: absolute;
-    left:9px;
-    top:9px;
-    width: 35px;
-    height: 35px;
+    left:12px;
+    top:12px;
+    width: 30px;
+    height: 30px;
 }
 
 
@@ -67,14 +67,14 @@
     width: 100%;
     box-shadow: 0 2px 10px 0 rgba(0,0,0,0.3);
     border-radius: 2em;
-    height: 5px;
+    height: 4px;
     background: #fff;
     transition: all .3s;
     position: relative;
 }
 
 #header > div > div > span + span {
-    margin-top: 7px;
+    margin-top: 5px;
 }
 
 .active span:nth-child(1) {
@@ -107,22 +107,22 @@
         transform: rotate(0);
     }
     50% {
-        top: 12px;
+        top: 9px;;
         transform: rotate(0);
     }
     100% {
-        top: 12px;
+        top: 9px;;
         transform: rotate(45deg);
     }
 }
 
 @keyframes top-2 {
     0% {
-        top: 12px;
+        top: 9px;;
         transform: rotate(45deg);
     }
     50% {
-        top: 12px;
+        top: 9px;;
         transform: rotate(0deg);
     }
     100% {
@@ -137,22 +137,22 @@
         transform: rotate(0);
     }
     50% {
-        bottom: 12px;
+        bottom: 9px;;
         transform: rotate(0);
     }
     100% {
-        bottom: 12px;
+        bottom: 9px;;
         transform: rotate(135deg);
     }
 }
 
 @keyframes bottom-2 {
     0% {
-        bottom: 12px;
+        bottom: 9px;;
         transform: rotate(135deg);
     }
     50% {
-        bottom: 12px;
+        bottom: 9px;;
         transform: rotate(0);
     }
     100% {
@@ -180,4 +180,4 @@
     100% {
         transform: scale(1);
     }
-}
\ No newline at end of file
+}

From fb057095d4f59b6a231fbf58a99389b4cbeacf43 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 27 Dec 2023 17:54:01 +0100
Subject: [PATCH 118/228] offline indicator adjustement

---
 .../silverpeas/mobile/client/components/base/PageHeader.java  | 4 ++--
 .../org/silverpeas/mobile/client/resources/application.css    | 2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

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 32e20dcac..068b9d42b 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
@@ -85,11 +85,11 @@ public void closeMenuButton() {
   }
 
   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) {
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

From 382f33d52c317d228861f73f6b266f9a4f95a46b Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Wed, 27 Dec 2023 23:38:49 +0100
Subject: [PATCH 119/228] Update dependency on Silverpeas to version
 6.4-JR-build231227

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 602741874..3dc5ba1ba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231224</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231227</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 9cca2a01c2b702797a4947858e4fd773029d6033 Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 31 Dec 2023 23:35:58 +0100
Subject: [PATCH 120/228] Update dependency on Silverpeas to version
 6.4-JR-build231231

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 3dc5ba1ba..715c21b83 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231227</silverpeas.version>
+    <silverpeas.version>6.4-JR-build231231</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
      <next.release>6.4-JR</next.release>

From 45f8cd8505734160689520527512b8c006a6f400 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 2 Jan 2024 16:55:54 +0100
Subject: [PATCH 121/228] new back button

---
 .../client/components/base/PageHeader.ui.xml       |  2 +-
 .../silverpeas/mobile/public/icons/arrow_back.svg  |  4 ++++
 .../java/org/silverpeas/mobile/public/spmobile.css | 14 ++++++--------
 .../src/main/webapp/WEB-INF/manifest.json.template |  2 ++
 4 files changed, 13 insertions(+), 9 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/arrow_back.svg

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 c14640182..67b6fff74 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
@@ -37,6 +37,6 @@
     </div>
 
     <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}"/>
+    <g:Anchor ui:field="back" styleName="ui-btn-right ui-btn-corner-all ui-btn ui-icon-grid back" text=""/>
   </g:HTMLPanel>
 </ui:UiBinder> 
\ 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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 49d72339a..f4742319a 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
@@ -490,14 +490,12 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 .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: 44px;
+  width: 36px;
+  margin: 4px 0 0 0;
+  padding: 0 0 0 0;
 }
 
 /* HOME */
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 66f37f344..81dbc989c 100644
--- a/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
+++ b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
@@ -1,12 +1,14 @@
 {
   "name": "Silverpeas Mobile",
   "short_name": "SpMobile",
+  "id": "spmobile",
   "background_color": "#FFFFFF",
   "description": "Version mobile de Silverpeas",
   "orientation": "portrait-primary",
   "scope": "/silverpeas/spmobile/",
   "start_url": "/silverpeas/spmobile/spmobil.jsp",
   "display": "standalone",
+  "display_override": ["standalone", "minimal-ui"],
   "theme_color": "#00FF00",
   "icons": [
     {

From e3db15acd4c682fe6bed5d24ace1fc664a2ec4e5 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 2 Jan 2024 18:33:02 +0100
Subject: [PATCH 122/228] Fix multi display of main page

---
 .../org/silverpeas/mobile/client/SpMobil.java |  2 ++
 .../network/MethodCallbackOnlineOnly.java     | 19 +++++++++++++------
 2 files changed, 15 insertions(+), 6 deletions(-)

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 5eae9a551..a894927b9 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
@@ -280,6 +280,7 @@ 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) ||
@@ -394,6 +395,7 @@ public void onFailure(final Method method, final Throwable t) {
           tryToRelogin(attempt);
         }
       };
+      action.setRelogin(false);
       action.attempt();
     } else {
       //Login
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();

From d9bbf8c20f3c1a937ec027a105356b19f2599c1d Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 3 Jan 2024 15:05:21 +0100
Subject: [PATCH 123/228] new shortcuts apparence

---
 .../mobile/public/icons/chat_shortcut.svg         |  1 +
 .../mobile/public/icons/contacts_shortcut.svg     |  1 +
 .../mobile/public/icons/favorites_shortcut.svg    |  1 +
 .../mobile/public/icons/home_shortcut.svg         |  1 +
 .../mobile/public/icons/tasks_shortcut.svg        |  1 +
 .../org/silverpeas/mobile/public/spmobile.css     | 15 ++++++++-------
 6 files changed, 13 insertions(+), 7 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks_shortcut.svg

diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat_shortcut.svg
new file mode 100644
index 000000000..960bb0c16
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/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" fill="#7eb73b"/></svg>
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts_shortcut.svg
new file mode 100644
index 000000000..19ef8754c
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/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" fill="#7eb73b"/></svg>
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg
new file mode 100644
index 000000000..89c8ae677
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/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="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="#7eb73b"/></svg>
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.svg
new file mode 100644
index 000000000..ffbb6ce97
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.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="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" fill="#7eb73b"/></svg>
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks_shortcut.svg
new file mode 100644
index 000000000..4447876ec
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/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" fill="#000000"><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" fill="#7eb73b"/></svg>
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 f4742319a..d16431ac8 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
@@ -449,28 +449,29 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   top: auto;
   flex: 1;
   text-indent: -300em;
-  border-left: 1px solid #151515;
-  border-right: 1px solid #444444;
+  transform: scale(1.5);
 }
 
 #navigation-footer .btn-list-navigation {
-  background: transparent url(packImagesNavigation.png) center -640px no-repeat;
+  background: transparent url('icons/home_shortcut.svg') center no-repeat;
 }
 
 #navigation-footer .btn-find-contact {
-  background: transparent url(packImagesNavigation.png) center -709px no-repeat;
+  background: transparent url('icons/contacts_shortcut.svg') center no-repeat;
+    transform: scale(1.2);
 }
 
 #navigation-footer .btn-update-tchat {
-  background: transparent url(packImagesNavigation.png) center -771px no-repeat;
+  background: transparent url('icons/chat_shortcut.svg') center no-repeat;
+    transform: scale(1.2);
 }
 
 #navigation-footer .btn-list-task {
-  background: transparent url(packImagesNavigation.png) center -835px no-repeat;
+  background: transparent url('icons/tasks_shortcut.svg') center no-repeat;
 }
 
 #navigation-footer .btn-list-favoris {
-  background: transparent url(packImagesNavigation.png) center -892px no-repeat;
+  background: transparent url('icons/favorites_shortcut.svg') center no-repeat;
 }
 
 #header h1 {

From afc9162799e15c00097a5991ae0f03c1b7b3edc5 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 3 Jan 2024 16:10:38 +0100
Subject: [PATCH 124/228] notifications filter adjustement

---
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

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 d16431ac8..45a773e84 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
@@ -476,7 +476,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #header h1 {
   color: #fff;
-  font-size: 1em;
+  font-size: 1.1em;
   font-weight: normal;
   left: 60px;
   line-height: 44px;
@@ -487,7 +487,6 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   right: 94px;
   top: 1px;
   height: 44px;
-  text-shadow: 0 1px 0 #000;
 }
 
 .ui-btn-right.back {
@@ -1565,6 +1564,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 {
@@ -1934,7 +1934,7 @@ form .forms .fields > li:nth-child(even) {
 }
 
 .content > .ui-listview.ui-listview-inset {
-  padding-top: 3.25em;
+  padding-top: 3em;
 }
 
 .content-navigation {

From b69b66dcd16655a4639c68f3348b1dbbba188176 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 3 Jan 2024 18:14:53 +0100
Subject: [PATCH 125/228] change icons

---
 .../mobile/public/icons/apps/blog.svg         |   1 +
 .../mobile/public/icons/apps/book_online.svg  |   1 +
 .../mobile/public/icons/apps/calendar.svg     |   1 +
 .../mobile/public/icons/apps/classifieds.svg  |   1 +
 .../mobile/public/icons/apps/faq.svg          |   1 +
 .../mobile/public/icons/apps/folder.svg       |   1 +
 .../mobile/public/icons/apps/form.svg         |   1 +
 .../mobile/public/icons/apps/link.svg         |   1 +
 .../public/icons/apps/media_library.svg       |   1 +
 .../mobile/public/icons/apps/news.svg         |   1 +
 .../mobile/public/icons/apps/poll.svg         |   1 +
 .../mobile/public/icons/apps/quiz.svg         |   1 +
 .../mobile/public/icons/apps/webpage.svg      |   1 +
 .../mobile/public/icons/apps/workflow.svg     |   1 +
 .../mobile/public/icons/comment.svg           |   1 +
 .../silverpeas/mobile/public/icons/event.svg  |   1 +
 .../public/icons/favorites_shortcut.svg       |   2 +-
 .../silverpeas/mobile/public/icons/media.svg  |   1 +
 .../mobile/public/icons/publication.svg       |   1 +
 .../silverpeas/mobile/public/icons/trash.svg  |   1 +
 .../org/silverpeas/mobile/public/spmobil.jsp  | 176 ++++++++++++++++++
 .../org/silverpeas/mobile/public/spmobile.css |  78 +++++---
 22 files changed, 253 insertions(+), 22 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/blog.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/book_online.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/classifieds.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/faq.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/form.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/link.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/media_library.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/poll.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/quiz.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/webpage.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/workflow.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/comment.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/event.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/media.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/publication.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/trash.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/spmobil.jsp

diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/blog.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/blog.svg
new file mode 100644
index 000000000..b3be43d4a
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/book_online.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/book_online.svg
new file mode 100644
index 000000000..19fca0725
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/calendar.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg
new file mode 100644
index 000000000..f0eb348d9
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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>
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/classifieds.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/classifieds.svg
new file mode 100644
index 000000000..c7605a5e8
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/faq.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/faq.svg
new file mode 100644
index 000000000..10b5689af
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/folder.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg
new file mode 100644
index 000000000..453cba297
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/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>
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/form.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/form.svg
new file mode 100644
index 000000000..8ce6b0557
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/link.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/link.svg
new file mode 100644
index 000000000..50ce54c18
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/media_library.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/media_library.svg
new file mode 100644
index 000000000..f8b20debe
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/news.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg
new file mode 100644
index 000000000..c043f11a8
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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>
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/poll.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/poll.svg
new file mode 100644
index 000000000..68dc07849
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/quiz.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/quiz.svg
new file mode 100644
index 000000000..ca289cb99
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/webpage.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/webpage.svg
new file mode 100644
index 000000000..1265c26da
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/icons/apps/workflow.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/workflow.svg
new file mode 100644
index 000000000..3c0669d29
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/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/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/favorites_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg
index 89c8ae677..4d6428b73 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg
@@ -1 +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="#7eb73b"/></svg>
+<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" fill="#7eb73b"/></svg>
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/publication.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/publication.svg
new file mode 100644
index 000000000..f720a0c46
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/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/public/icons/trash.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/trash.svg
new file mode 100644
index 000000000..560d174b9
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/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/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 45a773e84..ed829b851 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
@@ -773,7 +773,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   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,
@@ -799,71 +799,105 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 .app-formsOnline a {
-  background-position: 0.65em -2208px;
+  background: transparent url('icons/apps/form.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-almanach a {
-  background-position: -20px -2167px;
+  background: transparent url('icons/apps/calendar.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-link a {
-  background-position: 0.65em -1684px;
+  background: transparent url('icons/apps/link.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-actuality a {
-  background-position: 0.5em -1026px;
+  background: transparent url('icons/apps/news.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .folder-ged a {
-  background-position: 0.5em 0.5em;
+  background: transparent url('icons/apps/folder.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-pageWeb a {
-  background-position: 0.7em -1395px;
+  background: transparent url('icons/apps/webpage.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-blog a {
-  background-position: 0.65em -1509px;
+  background: transparent url('icons/apps/blog.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-classifieds a {
-  background-position: 0.65em -2240px;
+  background: transparent url('icons/apps/classifieds.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-survey a {
-  background-position: 0.65em -2270px;
+  background: transparent url('icons/apps/quiz.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-polling a {
-  background-position: 0.65em -2330px;
+  background: transparent url('icons/apps/poll.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-faq a {
-  background-position: 0.65em -2300px;
+  background: transparent url('icons/apps/faq.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-workflow a {
-  background-position: 0.65em -1595px;
+  background: transparent url('icons/apps/workflow.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .app-resourcesManager a {
-  background-position: 0.65em -2360px;
+  background: transparent url('icons/apps/book_online.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .folder-galery a {
-  background-position: 0.5em -95px;
+  background: transparent url('icons/apps/media_library.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .publication a {
-  background-position: 0.5em -190px;
+  background: transparent url('icons/publication.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .trash a {
-  background-position: 0.5em -495px;
+  background: transparent url('icons/trash.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .media a {
-  background-position: 0.5em -287px;
+  background: transparent url('icons/media.svg') no-repeat;
+  background-position-y: center;
+  background-position-x: 0.5em;
 }
 
 .media-thumb:first-child {
@@ -981,7 +1015,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 {
@@ -1056,8 +1090,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 {

From 26f561d7e296678e91adb8f35057b725f5ca7c8f Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 3 Jan 2024 19:04:33 +0100
Subject: [PATCH 126/228] improve navigation

---
 .../client/apps/comments/pages/CommentsPage.java      |  1 -
 .../mobile/client/components/base/PageHeader.java     |  2 ++
 .../java/org/silverpeas/mobile/public/spmobile.css    | 11 ++++++++++-
 3 files changed, 12 insertions(+), 2 deletions(-)

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/components/base/PageHeader.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.java
index 068b9d42b..820ac1bea 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
@@ -93,6 +93,8 @@ public void hideOfflineIndicator() {
   }
 
   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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index ed829b851..1997a5418 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
@@ -494,8 +494,9 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   border: none;
   height: 44px;
   width: 36px;
-  margin: 4px 0 0 0;
+  margin: 3px 0 0 0;
   padding: 0 0 0 0;
+  left:0;
 }
 
 /* HOME */
@@ -1219,11 +1220,19 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   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: 15px ;
 }
 
 #add-comment .btn-publicate.inactif {
   color: #999;
   text-decoration: none;
+  filter: opacity(0.5);
 }
 
 #attachments li a {

From e5d9fcac167373faa98265a2312b78c324744c1e Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 3 Jan 2024 19:17:17 +0100
Subject: [PATCH 127/228] change position of qvf menu

---
 .../main/java/org/silverpeas/mobile/public/spmobile.css   | 8 ++++++++
 1 file changed, 8 insertions(+)

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 1997a5418..d324aca6c 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
@@ -1986,6 +1986,14 @@ form .forms .fields > li:nth-child(even) {
   padding: 1em;
 }
 
+#actions {
+  position: absolute;
+  top: -44px;
+  right: 0.5em;
+  filter: invert(1);
+  z-index: 9999;
+}
+
 #action-button {
   border: 0;
   position: absolute;

From f271d8db57c2594b9fd16a8fa9301b4e0632d488 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 4 Jan 2024 16:35:17 +0100
Subject: [PATCH 128/228] add transition between pages

---
 .../org/silverpeas/mobile/client/SpMobil.java |  4 +--
 .../client/common/navigation/PageHistory.java | 10 +++----
 .../components/base/NavigationMenu.java       | 12 ++++++++
 .../mobile/client/components/base/Page.java   | 28 +++++++++++++++++--
 .../silverpeas/mobile/public/animations.css   |  9 ++++++
 .../org/silverpeas/mobile/public/spmobile.css |  1 +
 6 files changed, 54 insertions(+), 10 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css

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 a894927b9..2004d5b70 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
@@ -318,13 +318,13 @@ public void onSuccess(final Method method, final HomePageDTO result) {
   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());
+    SpMobil.getMainPage().setContent(new CookiesPage(), true);
   }
 
   /**
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..62d02ade9 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,7 @@ private void back(String token) {
           if (page != null) {
             page.stop();
             page = pages.peek();
-            SpMobil.getMainPage().setContent(page);
+            SpMobil.getMainPage().setContent(page, false);
           } else {
             SpMobil.restoreMainPage();
           }
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 2baf2470c..776a9d0d8 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,9 @@
 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.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;
@@ -128,8 +130,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 +142,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() {
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 05d596566..d4ac56bc4 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;
@@ -45,7 +46,6 @@
 public class Page extends Composite implements Window.ScrollHandler {
 
   private static PageUiBinder uiBinder = GWT.create(PageUiBinder.class);
-
   interface PageUiBinder extends UiBinder<Widget, Page> {
   }
 
@@ -64,7 +64,31 @@ 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);
+    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;
     contentPlace.setWidget(content);
     header.setPageTitle(content.getPageTitle());
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..22b1f07b9
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css
@@ -0,0 +1,9 @@
+.closing-page {
+    transition: transform 300ms;
+    transform: translateX(+100%);
+}
+
+.opening-page {
+    transition: transform 300ms;
+    transform: translateX(-100%);
+}
\ No newline at end of file
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 d324aca6c..75d221f92 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
@@ -23,6 +23,7 @@
  */
 
 @import "components.css";
+@import "animations.css";
 
 /* Globals */
 /* Font

From 1d00768d4501bccd6352d26ff58e2cfea2ea0b38 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 4 Jan 2024 17:30:38 +0100
Subject: [PATCH 129/228] Fix contacts display

---
 .../client/apps/contacts/pages/ContactsPage.java       | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

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);
     }

From ac4af679b0124449ce32500b48b6cd1e2faf810d Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 5 Jan 2024 15:29:13 +0100
Subject: [PATCH 130/228] Fix some notifications mistakes

---
 .../mobile/client/components/attachments/Attachment.ui.xml    | 2 +-
 .../org/silverpeas/mobile/client/components/base/Page.java    | 4 +++-
 .../org/silverpeas/mobile/client/components/base/Page.ui.xml  | 1 +
 3 files changed, 5 insertions(+), 2 deletions(-)

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 ee43435d2..06b04e267 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,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:Anchor ui:field="link" styleName="expand-more" href="#">
+    <g:Anchor ui:field="link" styleName="expand-more" href="javascript:;">
       <img ui:field="icon" src=""/>
       <span ui:field="name"></span><span ui:field="size" class="weight"></span>
       <span ui:field="description"></span>
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 d4ac56bc4..3b4fd4560 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
@@ -49,7 +49,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;
@@ -78,6 +78,7 @@ public void setContent(PageContent content, boolean newContent) {
     }
 
     getContentContainer().addClassName(transitionClass);
+    contentPlaceTmp.setWidget(content);
     Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
       @Override
       public boolean execute() {
@@ -90,6 +91,7 @@ public boolean execute() {
 
   private void displayContent(PageContent content) {
     this.content = content;
+    //contentPlaceTmp.remove(content);
     contentPlace.setWidget(content);
     header.setPageTitle(content.getPageTitle());
     header.setVisibleBackButton(PageHistory.getInstance().size() > 1);
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>
 

From 9b0f7630d87ad64a639ccf05020dcc37cb3c6dbc Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 5 Jan 2024 18:41:06 +0100
Subject: [PATCH 131/228] Feature #13920 : structure

---
 .../WebAppOriginAssociationServlet.java       | 69 +++++++++++++++++++
 .../webapp/WEB-INF/manifest.json.template     |  7 ++
 .../web-app-origin-association.template       | 11 +++
 mobile-war/src/main/webapp/WEB-INF/web.xml    | 10 +++
 .../src/main/webapp/spmobile/spmobil.jsp      |  1 +
 5 files changed, 98 insertions(+)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/WebAppOriginAssociationServlet.java
 create mode 100644 mobile-war/src/main/webapp/WEB-INF/web-app-origin-association.template

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/webapp/WEB-INF/manifest.json.template b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
index 81dbc989c..6f7ff117b 100644
--- a/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
+++ b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
@@ -22,4 +22,11 @@
       "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..fce5560cb 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>
diff --git a/mobile-war/src/main/webapp/spmobile/spmobil.jsp b/mobile-war/src/main/webapp/spmobile/spmobil.jsp
index 3f6e2c4ad..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");

From 064f76d64e4b4496798759958cb0cd261e8e56cd Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 5 Jan 2024 18:44:55 +0100
Subject: [PATCH 132/228] Feature #13920

---
 .../properties/org/silverpeas/mobile/mobileSettings.properties   | 1 +
 1 file changed, 1 insertion(+)

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 16f4ed702..6d6bfebfc 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
@@ -132,6 +132,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=

From fadebc59dca383bb300bc14ffd2980135a3a8d6f Mon Sep 17 00:00:00 2001
From: silveruser <devteam@silverpeas.net>
Date: Sun, 7 Jan 2024 23:35:10 +0100
Subject: [PATCH 133/228] Update dependency on Silverpeas to version
 6.4-JR-build240107

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 715c21b83..0f2426fda 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,7 @@
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.4-JR-build231231</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-JR</next.release>

From 1b15b311e7a15f9098d036e3dd97630b52277f67 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 8 Jan 2024 10:52:37 +0100
Subject: [PATCH 134/228] some css adjustements

---
 .../client/apps/faq/pages/FaqPage.ui.xml      |  2 +-
 .../mobile/public/icons/apps/calendar.svg     |  2 +-
 .../mobile/public/icons/apps/folder.svg       |  2 +-
 .../mobile/public/icons/apps/news.svg         |  2 +-
 .../silverpeas/mobile/public/icons/help.svg   |  2 +-
 .../silverpeas/mobile/public/icons/home.svg   |  2 +-
 .../silverpeas/mobile/public/icons/logout.svg |  2 +-
 .../mobile/public/icons/settings.svg          |  2 +-
 .../silverpeas/mobile/public/icons/star.svg   |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 20 +++++++++++++++++--
 10 files changed, 27 insertions(+), 10 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/star.svg

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..21434f329 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
@@ -32,7 +32,7 @@
 
   <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/public/icons/apps/calendar.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg
index f0eb348d9..bdce5c812 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg
@@ -1 +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>
\ No newline at end of file
+<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" fill="#7eb73b"/></svg>
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg
index 453cba297..5017b4816 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg
@@ -1 +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>
\ No newline at end of file
+<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" fill="#7eb73b"/></svg>
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg
index c043f11a8..550afbdd9 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg
@@ -1 +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>
\ No newline at end of file
+<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" fill="#7eb73b"/></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
index f7ffc5da2..8c2e93dcc 100644
--- 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
@@ -1 +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"/></svg>
\ No newline at end of file
+<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
index 8584f7ebb..e8d717eae 100644
--- 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
@@ -1 +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="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg>
\ No newline at end of file
+<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/logout.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/logout.svg
index bfd7e2923..7ec1ee20c 100644
--- 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
@@ -1 +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"/></svg>
\ No newline at end of file
+<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/settings.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/settings.svg
index e40c8496e..155b7d7a1 100644
--- 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
@@ -1 +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
+<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/star.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/star.svg
new file mode 100644
index 000000000..dcd73881f
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 75d221f92..85dab0822 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
@@ -430,7 +430,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #header,
 #navigation-footer {
-  background-color: #333;
+  background-color: black;
   height: 46px;
   border-bottom: 2px solid #151515;
   position: fixed;
@@ -473,6 +473,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #navigation-footer .btn-list-favoris {
   background: transparent url('icons/favorites_shortcut.svg') center no-repeat;
+  transform: scale(1.4);
 }
 
 #header h1 {
@@ -549,7 +550,8 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 .favoris-bloc a {
   padding-left: 2.5em;
   font-size: 0.95em;
-  background: transparent url(packImagesNavigation.png) 0.5em -1186px no-repeat;
+  background: transparent url('icons/star.svg') no-repeat;
+  background-size: auto;
 }
 
 .racourcis-bloc a {
@@ -2715,6 +2717,20 @@ a.popin-btn {
 	background-color: #FFF;
 }
 
+/******** 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 {

From 75fd0cca120f85f1ba90ae4e8afd1ca58fbb620d Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 8 Jan 2024 15:16:37 +0100
Subject: [PATCH 135/228] Feaure #13920

---
 mobile-war/src/main/webapp/WEB-INF/manifest.json.template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 6f7ff117b..e48086034 100644
--- a/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
+++ b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
@@ -21,7 +21,7 @@
       "type" : "image/png",
       "sizes" : "512x512"
     }
-  ]
+  ],
 
   "capture_links": "existing_client_event",
       "url_handlers" : [

From efb0c122e8159226c74fed7ea4cf8e5605a62864 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 8 Jan 2024 17:59:05 +0100
Subject: [PATCH 136/228] Feature #13920

---
 .../src/main/webapp/WEB-INF/app-sw.template   | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

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 a62354070..a379890f3 100644
--- a/mobile-war/src/main/webapp/WEB-INF/app-sw.template
+++ b/mobile-war/src/main/webapp/WEB-INF/app-sw.template
@@ -27,7 +27,30 @@ if (firebaseConfig != null) {
       fetch('/silverpeas/services/mobile/notification/readed/' + pushData["notificationId"], {
         method: 'PUT'
       });
-      event.waitUntil(self.clients.openWindow(pushData["permalink"]));
+
+      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"]);
+              }
+          }
+      }));
+
      }
   });
 

From 8e38e6d3be30a85a6263f538315d7ebaeb8be27a Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 9 Jan 2024 14:57:54 +0100
Subject: [PATCH 137/228] secure navigation

---
 .../silverpeas/mobile/client/components/base/PageHeader.java  | 4 +++-
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css   | 3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

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 820ac1bea..784d408dd 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
@@ -69,7 +69,9 @@ void onMenu(ClickEvent event) {
 
   @UiHandler("back")
   void onBack(ClickEvent event) {
-    PageHistory.getInstance().back();
+    if (PageHistory.getInstance().size() > 1) {
+      PageHistory.getInstance().back();
+    }
   }
 
   public void toogleMenuButton() {
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 85dab0822..5d3ea3d96 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
@@ -2062,7 +2062,8 @@ form .forms .fields > li:nth-child(even) {
 }
 
 .ui-listview.favoris a {
-  background: transparent url(packImagesNavigation.png) 0.5em -1182px no-repeat;
+  background: transparent url('icons/star.svg') no-repeat;
+  background-size: auto;
   padding-left: 2em;
 }
 

From 5b99f13d55e7b601b4f9e526245fe74b760a0de4 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 11 Jan 2024 17:44:54 +0100
Subject: [PATCH 138/228] attachments design review

---
 .../documents/resources/DocumentsCSS.java     |  36 ------------
 .../resources/DocumentsResources.java         |  52 ------------------
 .../apps/documents/resources/documents.css    |  47 ----------------
 .../client/apps/documents/resources/excel.gif | Bin 277 -> 0 bytes
 .../client/apps/documents/resources/image.gif | Bin 271 -> 0 bytes
 .../client/apps/documents/resources/pdf.gif   | Bin 267 -> 0 bytes
 .../apps/documents/resources/powerpoint.gif   | Bin 265 -> 0 bytes
 .../apps/documents/resources/unknown.gif      | Bin 276 -> 0 bytes
 .../client/apps/documents/resources/word.gif  | Bin 271 -> 0 bytes
 .../client/apps/media/pages/PhotoPage.java    |   9 +--
 .../client/common/network/NetworkHelper.java  |   4 ++
 .../components/attachments/Attachment.java    |  33 +++++------
 .../public/icons/files/file-type-calc.svg     |   1 +
 .../public/icons/files/file-type-excel.svg    |   1 +
 .../public/icons/files/file-type-image.svg    |   1 +
 .../public/icons/files/file-type-pdf.svg      |   1 +
 .../icons/files/file-type-powerpoint.svg      |   1 +
 .../icons/files/file-type-presentation.svg    |   1 +
 .../public/icons/files/file-type-unknown.svg  |   1 +
 .../public/icons/files/file-type-word.svg     |   1 +
 .../public/icons/files/file-type-writer.svg   |   1 +
 .../public/icons/files/file-type-zip.svg      |   1 +
 .../org/silverpeas/mobile/public/spmobile.css |  31 ++++++++---
 23 files changed, 57 insertions(+), 165 deletions(-)
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsCSS.java
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsResources.java
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/documents.css
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/excel.gif
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/image.gif
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/pdf.gif
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/powerpoint.gif
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/unknown.gif
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/word.gif
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-calc.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-excel.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-image.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-pdf.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-powerpoint.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-presentation.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-unknown.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-word.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-writer.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-zip.svg

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/apps/documents/resources/DocumentsCSS.java
deleted file mode 100644
index 87a021969..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsCSS.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.resources;
-
-import com.google.gwt.resources.client.CssResource;
-
-public interface DocumentsCSS extends CssResource {
-	String msword();
-	String msexcel();
-	String mspowerpoint();
-	String pdf();
-	String image();
-	String unknown();
-}
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/documents/resources/DocumentsResources.java
deleted file mode 100644
index c3e7f7493..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsResources.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.resources;
-
-import com.google.gwt.resources.client.ClientBundle;
-import com.google.gwt.resources.client.ImageResource;
-
-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();
-
-	@Source("image.gif")
-	ImageResource image();
-	
-	@Source("pdf.gif")
-	ImageResource pdf();
-	
-	@Source("unknown.gif")
-	ImageResource unknown();
-}
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/documents/resources/documents.css
deleted file mode 100644
index 0b6e1ac56..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/documents.css
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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/>.
- */
-
-@sprite .msword {
-	gwt-image: "msword";
-}
-
-@sprite .msexcel {
-	gwt-image: "msexcel";	
-}
-
-@sprite .mspowerpoint {
-	gwt-image: "mspowerpoint";
-}
-
-@sprite .pdf {
-	gwt-image: "pdf";	
-}
-
-@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/documents/resources/excel.gif b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/excel.gif
deleted file mode 100644
index 5065c302df8c48e90d7a75c877142daf3a1edd77..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 277
zcmV+w0qXuoNk%w1VGsZi0K^{vQ;#}KdP(l??tZO*mA#N`p=-p%#OUbgnVFg8<>fqg
zHFtM+WvNG4SXfGkNL!a(larHJf>wlzhdFCFW@~2f@bE!@IbEGW>+9>Gp`kcuCTp=v
zP*70){r&&{|NsC0A^8LW0018VEC2ui01yBW000G&;P)9>X_khlep%<fZkDb{cic(d
zVaO~(wi~XKz(7))q;g3t9vPmfG|GT=Bn(N!5_Kp74B_E=@esTL1^0r%+&T+Dln|K&
zJRLy04VQZy0}mDj0{{Yha9j#%ffF7U0+ARU6bcjp4gnDb5fKWJk(3%!QyLYZ9Ss_*
btgRKV0;wVmcvdhT4I&5}yuH4>2q6GFfv|4s

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 bdb614fceddd6c09001ff4d1afae739c622dc1dd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 271
zcmV+q0r37uNk%w1VGsZi0K@<QhlhuAFbaEnd;R(G+?*}>?9aAq5t>X5*oz(3*49lK
z2GV&Oo12@%dKI-<6V7WI$;rurIu69b!jqGezPPsZ;=Iq#&s!k~#A6lR-Q7eL2J-Uq
zp`oE~Z*Sh--v9sqA^8LV00000EC2ui01yBW000GyAjFMiS&Cb#t}DlQM2sNIW8WUb
zB*j+{wA$^FU`!I9WPvucB__vYlKH?y92g7KBCQ~*m_uYtnE))6L4{zzIK+WKgaSA>
z8V17w9=Kcr5_J%Jdl7Md3W<RN5OIeWi5ij`5CV*TkP4HVl>!oxo1qc{9Ui8qsHPbi
V9i^!m9<Z^i9UQH<xVao506PqTa_ay9

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 39449953c98948e1a929befd0e6f9da231be79b1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 267
zcmV+m0rdVyNk%w1VGsZi0K^{v#Kgq81_tQp=$V<B<>lr7|NnP)ch&#^!vO)+EG+Gs
znpjv^-%3i8laui7?(d|ehlht}XJ_s0?e^5v=>h`q@bKaT1LbaRw*Ua^>+7)q0HL9w
zP*70q008~{{r~^}A^8LW0018VEC2ui01yBW000Gu;P(MrX_kPfew*jM?v}2DC)`Bt
zWy35swj0hv$TU)&q;g3t9+%J#%mblVtscu&D4<%t7Dg7F$=p1KgZiL&T-N0>dd*NI
zCJePiA~zrq2@VPu4-<cTdma&gcnBB>0e=pNiWnFHmYJ3n4wD`W8lj@26{QZJA`1mm
RQw0km101rmw6X&s06W>da}odm

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 39e62545942e583e8326617e6214d399e93a709f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 265
zcmV+k0rvh!Nk%w1VGsZi0K^{v=jZ2ibadB?bnWf!n3$MeUS9C<@WsW&zC|DC=;-C;
z<?in8@9*#G>gws~>C}a6$jHc4R8*dxp8fgwii(Qh;NZYXB*4JHyE+r=>+7MRp-@mz
z{r&y8GYbFz|NsC0A^8LW0018VEC2ui01yBW000Gs;P*jVX_k<veiG-tu5_#)!6iVh
zC|pL&Dw`vL%W)LG%csL^Iyn`^fO6@0uGnh_#-Ugz0z|em#C5F#rbpdrG#n02z=}{~
zJDH4IPIqF~0|R+{9%)SvYYTw`gkTm34-;z)3yK^CR#|rj43w8npdALI3>*<65guGz
P9;Y=Mu(7hR1R(%Bg&}=M

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 c7f5e822237d91e32fd80394d056ac4a6e06501a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 276
zcmV+v0qg!pNk%w1VGsZi0K^{v<mBXieSKqNV~UE3nVFetYHF30m0n(6aBy&tkdWr)
z=682@R#sNT#KeSzg!A+B=jZ3~@$vHV^6Ba6?(XiPp`qyL=<Mw5@bK{M?d|I7>hJIG
zP*70o>+Ajf{r~^}A^8LW0018VEC2ui01yBW000G%;MY`SNj6`qR$lA26{>!OXF-qx
z0A5GPDT8NXx#c{7jsckPXePuPGMSJKdL7Nv^70H)4$tM%$!?{NRKSzTjLTZ6Cy-ir
zHk9_;>{+A`9vB;Vd2VGM2q^^~5g3AmdL9KS0v-|(jgJ(09s(%`mJ*klgA^VIDGVMD
a52B-v8y*a)UA3|)1RT1%yt)J*Apkq^m4qw+

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 73fbc81b6ae2f15abb81e5e525b06866335eb629..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 271
zcmV+q0r37uNk%w1VGsZi0K^{vgPYLq?(Q&FoX5w<=;-K~nVIF~<wRkKcXxMtme=|F
z{>9SjSXfwJg3+L`&XbdqwZ!CyhlgipXYlawz`(#<ccW8wzux5R^Yr@b>+7MRp-@mz
z{r&w(U9129|NsC0A^8LW0018VEC2ui01yBW000Gy;P(w$X_kYiej4Y#u9mI^N8Cov
zWyLH$wi}LP$UG>Yj&jK)7LOf|bSmw@IFTrI+7S}49Y6xG05}?rP9}5XAUcZ#BvF9~
z9O`w(-BE}I78VB=9RYfL90?s~cM638h8z-oiwXi26CRI{l3H7u6OaKM3{0jS6RD#N
VA`Bi^S01b%1sk@vxV8l$06SdLdJF&n

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 086741dcb..b7b19d238 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
@@ -39,9 +39,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 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,6 +55,7 @@
 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;
@@ -95,14 +94,11 @@ interface PhotoPageUiBinder extends UiBinder<HTMLPanel, PhotoPage> {
 
   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");
@@ -143,8 +139,7 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) {
     if (isVisible()) {
       this.photo = (PhotoDTO) event.getPreview();
       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());
 
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/components/attachments/Attachment.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java
index e1936759c..57de0f37e 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
@@ -38,7 +38,6 @@
 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.apps.notifications.NotificationsApp;
 import org.silverpeas.mobile.client.common.Notification;
 import org.silverpeas.mobile.client.common.mobil.MobilUtils;
@@ -65,8 +64,6 @@ public class Attachment extends Composite {
 
   @UiField
   HTML share, view, notify;
-
-  protected DocumentsResources ressources = null;
   private DocumentsMessages msg = null;
   private ApplicationMessages globalMsg = null;
   private SimpleDocumentDTO data = null;
@@ -86,8 +83,6 @@ 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));
   }
 
@@ -132,21 +127,27 @@ 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 {
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-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-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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 5d3ea3d96..08e22f13d 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
@@ -1063,6 +1063,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 .list-reservations li > *,
 .list-detail-event  > * {
   padding:1em;
+  padding-left: 0.5em;
 }
 
 #linkedPublications li {
@@ -1196,7 +1197,6 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #add-comment,
 .introduction {
-  padding: 0 1em;
   position: relative;
   margin-bottom: 1em
 }
@@ -1216,6 +1216,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #add-comment textarea.ui-input-text {
   font-size: 9pt;
+  height: 7em;
 }
 
 #add-comment .btn-publicate {
@@ -1229,7 +1230,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   position: absolute;
   right: 0;
   bottom: 5px;
-  margin-right: 15px ;
+  margin-right: 1em ;
 }
 
 #add-comment .btn-publicate.inactif {
@@ -1243,22 +1244,37 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   color: #000;
 }
 
-#attachments li a .weight,
-#a-media #attachments li a .dimension {
+#attachments li a .weight {
   display: block;
   padding-left: 24px;
   color: #848484;
+  margin-left: 8px;
+}
+
+#a-media #attachments li a .dimension {
+  display: block;
+  color: #848484;
+  padding-left: 0px;
+  margin-left: calc(1em + 24px);
 }
 
 #a-media #attachments li a .weight {
   display: inline-block;
-  padding-left: 4px;
+  padding-left: 0px;
+  margin-left: calc(1em + 24px);
+}
+
+#a-media #attachments li a img {
+  margin-left: 0.5em;
 }
 
 #attachments li a img {
   vertical-align: bottom;
   border: 0;
   margin-right: 8px;
+  float: left;
+  height: 24px;
+  width: 24px;
 }
 
 #attachments li a.expand-more {
@@ -1278,7 +1294,8 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #attachments li a span {
-  display: inline-block;
+  display: block;
+  padding-right:0.5em;
 }
 
 .ops-open, .ops-open #share, .ops-open #download, .ops-open #view, .ops-open #notify {
@@ -1490,7 +1507,7 @@ input.filter-contacts {
   width: 24px;
   border: 1px solid #ccc;
   float: right;
-  margin-right: 1em;
+  /*margin-right: 1em;*/
 }
 
 .list-contacts .user-name,

From e44fd23a2e5e062b326cfadcf0df5fb9c5bc552a Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 12 Jan 2024 18:12:23 +0100
Subject: [PATCH 139/228] change in the ergonomics of the action menu and
 action buttons

---
 .../widgets/AcceptParticipationButton.java    |  3 +-
 .../pages/widgets/AddReminderButton.java      |  3 +-
 .../widgets/RejectParticipationButton.java    |  3 +-
 .../widgets/TentativeParticipationButton.java |  3 +-
 .../documents/pages/widgets/ShareButton.java  | 53 ++++++++-----------
 .../pages/widgets/AddToFavoritesButton.java   |  3 +-
 .../pages/widgets/ViewMyRequestsButton.java   |  3 +-
 .../widgets/ViewRequestsToValidateButton.java |  3 +-
 .../apps/media/pages/MediaNavigationPage.java |  9 +++-
 .../media/pages/MediaNavigationPage.ui.xml    |  1 +
 .../media/pages/widgets/AddMediaButton.java   |  7 +--
 .../media/pages/widgets/AddMediaButton.ui.xml |  4 +-
 .../pages/widgets/NotifyButton.java           |  3 +-
 .../pages/widgets/DeleteButton.java           | 26 ++++-----
 .../pages/widgets/MarkAsReadButton.java       |  3 +-
 .../pages/widgets/AddReservationButton.java   |  3 +-
 .../widgets/DeleteReservationButton.java      |  3 +-
 .../sharesbox/pages/widgets/DeleteButton.java |  3 +-
 .../workflow/pages/widgets/ActionButton.java  |  3 +-
 .../client/components/base/ActionsMenu.java   | 17 ++++--
 .../components/base/widgets/ShareButton.java  |  3 +-
 .../silverpeas/mobile/public/animations.css   | 13 ++++-
 .../org/silverpeas/mobile/public/spmobile.css | 43 ++++++++++++---
 23 files changed, 138 insertions(+), 77 deletions(-)

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/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..9aa5fe33c 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
@@ -36,6 +36,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;
 
@@ -70,7 +71,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/documents/pages/widgets/ShareButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/ShareButton.java
index 9a90c6296..2253db70f 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
@@ -22,28 +22,21 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-package org.silverpeas.mobile.client.apps.documents.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.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.apps.favorites.resources.FavoritesMessages;
+import org.silverpeas.mobile.client.common.Html5Utils;
 import org.silverpeas.mobile.client.components.base.ActionItem;
-import org.silverpeas.mobile.shared.dto.tickets.TicketDTO;
+import org.silverpeas.mobile.client.components.base.ActionsMenu;
+import org.silverpeas.mobile.client.resources.ApplicationMessages;
 
 /**
  * @author: svu
@@ -57,34 +50,34 @@ interface ShareButtonUiBinder extends UiBinder<HTMLPanel, ShareButton> {
     @UiField  HTMLPanel container;
     @UiField  Anchor share;
 
-    @UiField(provided = true) protected DocumentsMessages msg = null;
-    private String instanceId, contentId, contentType, title, pageTitle;
-
-    private int shareLevel;
+    @UiField(provided = true) protected ApplicationMessages msg = null;
+    private String title, text, url;
 
     public ShareButton() {
-        msg = GWT.create(DocumentsMessages.class);
+        msg = GWT.create(ApplicationMessages.class);
         initWidget(uiBinder.createAndBindUi(this));
         setId("share");
     }
-
-    public void init(int shareLevel, String instanceId, String contentId, String contentType, String title, String pageTitle) {
-        this.instanceId = instanceId;
-        this.contentId = contentId;
-        this.contentType = contentType;
+    public void init(String title, String text, String url) {
         this.title = title;
-        this.pageTitle = pageTitle;
-        this.shareLevel = shareLevel;
+        this.text = text;
+        this.url = url;
+        try {
+            if (!Html5Utils.canShare(title, text, url)) {
+                setVisible(false);
+            }
+        } catch(Throwable t) {
+            setVisible(false);
+        }
     }
-
     @UiHandler("share")
-    void displaySharePage(ClickEvent event) {
-        SharingPage page = new SharingPage();
-        page.setData(contentType, contentId, instanceId);
-        page.show();
+    void share(ClickEvent event) {
+        Html5Utils.share(title, text, url);
 
         // 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/favorites/pages/widgets/AddToFavoritesButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/AddToFavoritesButton.java
index c95b6c201..385a1ec29 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
@@ -35,6 +35,7 @@
 import org.silverpeas.mobile.client.apps.favorites.resources.FavoritesMessages;
 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
@@ -75,7 +76,7 @@ void displayNotificationPage(ClickEvent event){
         EventBus.getInstance().fireEvent(addEvent);
 
         // 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/ViewMyRequestsButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/widgets/ViewMyRequestsButton.java
index dd4d8e9fe..e0d59745a 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
@@ -36,6 +36,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
@@ -68,7 +69,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/media/pages/MediaNavigationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java
index 67fe52b3a..129d6b8b1 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,6 +27,8 @@
 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.apps.favorites.pages.widgets.AddToFavoritesButton;
 import org.silverpeas.mobile.client.apps.media.events.app.MediaViewShowEvent;
@@ -44,6 +46,7 @@
 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.ActionsList;
 import org.silverpeas.mobile.client.components.base.ActionsMenu;
 import org.silverpeas.mobile.client.components.base.LoadingItem;
 import org.silverpeas.mobile.client.components.base.PageContent;
@@ -66,6 +69,7 @@ public class MediaNavigationPage extends PageContent implements View, MediaNavig
   private AddMediaButton buttonImport = new AddMediaButton();
   private LoadingItem endline = new LoadingItem();
   @UiField ActionsMenu actionsMenu;
+  @UiField ActionsList actionsShortcuts;
 
   private String rootAlbumId, instanceId;
   private RightDTO rights;
@@ -96,7 +100,10 @@ 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) {
+          //list.add(buttonImport);
+          actionsShortcuts.addAction(buttonImport);
+        }
       }
       List<BaseDTO> dataItems = event.getData();
       populateList(dataItems);
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..52c6aabab 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,6 +29,7 @@
              xmlns:components="urn:import:org.silverpeas.mobile.client.components">
 
   <g:HTMLPanel styleName="content">
+    <base:ActionsList ui:field="actionsShortcuts"/>
     <base:ActionsMenu ui:field="actionsMenu"/>
     <components:UnorderedList ui:field="list" 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/apps/media/pages/widgets/AddMediaButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java
index 3486efd17..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> {
     }
 
@@ -108,7 +106,6 @@ void upload(ClickEvent event) {
         } 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/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/pages/widgets/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.java
index 6a1b69793..517ceea35 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/apps/notificationsbox/pages/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.notificationsbox.pages.widgets;
+package org.silverpeas.mobile.client.apps.sharesbox.pages.widgets;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
@@ -31,12 +31,13 @@
 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.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.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.notifications.NotificationBoxDTO;
+import org.silverpeas.mobile.client.components.base.ActionsMenu;
+import org.silverpeas.mobile.shared.dto.tickets.TicketDTO;
 
 import java.util.List;
 
@@ -49,7 +50,7 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
 
   private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class);
 
-  private NotificationsBoxPage parentPage;
+  private SharesBoxPage parentPage;
 
   @UiField
   HTMLPanel container;
@@ -57,28 +58,27 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
   Anchor delete;
 
   @UiField(provided = true)
-  protected NotificationsMessages msg = null;
+  protected ShareMessages msg = null;
 
 
   public DeleteButton() {
-    msg = GWT.create(NotificationsMessages.class);
+    msg = GWT.create(ShareMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
     setId("delete");
   }
 
   @UiHandler("delete")
   void delete(ClickEvent event) {
-    List<NotificationBoxDTO> selection = parentPage.getSelectedNotification();
-
-    DeleteNotificationsEvent deleteEvent = new DeleteNotificationsEvent();
+    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");
+    ActionsMenu.close(getElement());
   }
 
-  public void setParentPage(final NotificationsBoxPage parentPage) {
+  public void setParentPage(final SharesBoxPage parentPage) {
     this.parentPage = parentPage;
   }
 }
\ No newline at end of file
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..1508dd38c 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;
@@ -75,7 +76,7 @@ void read(ClickEvent event) {
     EventBus.getInstance().fireEvent(notReadEvent);
 
     // hide menu
-    getElement().getParentElement().removeAttribute("style");
+    ActionsMenu.close(getElement());
   }
 
   public void setParentPage(final NotificationsBoxPage parentPage) {
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..31bb17510 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
@@ -13,6 +13,7 @@
 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 +48,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..0c0a85428 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
@@ -15,6 +15,7 @@
 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 +62,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/pages/widgets/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.java
index bcdc71893..517ceea35 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/apps/sharesbox/pages/widgets/DeleteButton.java
@@ -36,6 +36,7 @@
 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.client.components.base.ActionsMenu;
 import org.silverpeas.mobile.shared.dto.tickets.TicketDTO;
 
 import java.util.List;
@@ -74,7 +75,7 @@ void delete(ClickEvent event) {
     if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent);
 
     // hide menu
-    getElement().getParentElement().removeAttribute("style");
+    ActionsMenu.close(getElement());
   }
 
   public void setParentPage(final SharesBoxPage parentPage) {
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/components/base/ActionsMenu.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsMenu.java
index e3c755e2c..d574dbe39 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,11 +25,14 @@
 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.Element;
 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.Window;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HTMLPanel;
@@ -57,17 +60,25 @@ public ActionsMenu() {
         actions.getElement().setId("action-button");
         container.getElement().setId("actions");
         container.getElement().getStyle().setDisplay(Style.Display.NONE);
+        listActions.getElement().addClassName("closed-qvf-menu");
     }
 
     @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");
         } else {
-            listActions.setStyledisplay(Style.Display.NONE);
+            listActions.getElement().removeClassName("open-qvf-menu");
+            listActions.getElement().addClassName("closed-qvf-menu");
         }
     }
 
+    public static void close(Element action) {
+        action.getParentElement().removeClassName("open-qvf-menu");
+        action.getParentElement().addClassName("closed-qvf-menu");
+    }
+
     public boolean isEmpty() {
         return (listActions.getWidgetCount() == 0);
     }
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
index fee1e8e2b..2253db70f 100644
--- 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
@@ -35,6 +35,7 @@
 import org.silverpeas.mobile.client.apps.favorites.resources.FavoritesMessages;
 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;
 
 /**
@@ -74,7 +75,7 @@ void share(ClickEvent event) {
         Html5Utils.share(title, text, url);
 
         // hide menu
-        getElement().getParentElement().removeAttribute("style");
+        ActionsMenu.close(getElement());
     }
 
 
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
index 22b1f07b9..960b5665a 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css
@@ -6,4 +6,15 @@
 .opening-page {
     transition: transform 300ms;
     transform: translateX(-100%);
-}
\ No newline at end of file
+}
+
+.open-qvf-menu {
+    opacity: 1.0;
+    transition: opacity 250ms linear;
+}
+
+.closed-qvf-menu {
+    opacity: 0.0;
+    transition: opacity 250ms linear;
+}
+
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 08e22f13d..b59ca3884 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
@@ -772,7 +772,7 @@ 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,
+.folder-ged a, .folder-galery a, .publication a, .media a, .trash a, .app-actuality 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;
@@ -780,20 +780,17 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 2.5em
 }
 
-.add-media,
 .add-task {
   background-color: #FDF4EF;
   border-bottom: 1px solid #EDBCBB;
   border-top: 1px solid #EDBCBB;
 }
 
-.ui-listview > li.add-media a,
 .ui-listview > li.add-task a {
   background: #FDF4EF none;
   padding-left: 1em
 }
 
-.ui-listview > li.add-media a::after,
 .ui-listview > li.add-task a::after {
   background: transparent url('icons/add.svg') no-repeat;
 }
@@ -904,6 +901,19 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   background-position-x: 0.5em;
 }
 
+.add-media {
+  height: 24px;
+  width: 24px;
+  filter: invert(1);
+  background: url('icons/add.svg') no-repeat;
+}
+
+.add-media a {
+  height: 24px;
+  width: 24px;
+  display: block;
+}
+
 .media-thumb:first-child {
   clear: left;
 }
@@ -2021,18 +2031,19 @@ form .forms .fields > li:nth-child(even) {
   height: 24px;
   text-indent: -3000px;
   top: 1em;
-  right: 1em;
+  right: 0.5em;
   background: transparent url("qvf.svg") 0 0 no-repeat;
   outline: none;
   z-index: 999;
+  padding-left: 1em;
+  padding-right: 1em;
 }
 
 #action-bloc {
-  display: none;
   border: 0;
   position: absolute;
-  top: 3em;
-  right: 1em;
+  top: 46px;
+  right: 0.1em;
   padding: 0;
   margin: 0;
   width: 10em;
@@ -2054,6 +2065,22 @@ form .forms .fields > li:nth-child(even) {
   width: 100%;
 }
 
+#actionsList {
+  position: absolute;
+  top: -31px;
+  right: 4em;
+  z-index: 9999;
+}
+
+#actionsList ul {
+  margin: 0;
+  padding: 0;
+}
+
+#actionsList li {
+  list-style: none;
+}
+
 .config .actuality a {
   background-image: url(packImagesNavigation.png);
   background-position: right -1022px;

From 8eb7d0eb51042e80de7919a5da5408a3d522d6a1 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 12 Jan 2024 18:16:48 +0100
Subject: [PATCH 140/228] change in the ergonomics of the action menu and
 action buttons

---
 .../client/components/base/ActionsList.java   | 81 +++++++++++++++++++
 .../client/components/base/ActionsList.ui.xml | 32 ++++++++
 2 files changed, 113 insertions(+)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.ui.xml

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..fb2b0353a
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.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;
+
+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().getStyle().setDisplay(Style.Display.NONE);
+    }
+    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().getStyle().setDisplay(Style.Display.BLOCK);
+    }
+
+    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().getStyle().setDisplay(Style.Display.NONE);
+      }
+    }
+}
\ 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

From d12e7dfa738f8797ba9ee29753f78eb5f9531f66 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 15 Jan 2024 17:06:31 +0100
Subject: [PATCH 141/228] enhance tasks list

---
 .../apps/media/pages/MediaNavigationPage.java |  1 -
 .../client/apps/tasks/pages/TasksPage.java    | 13 ++--
 .../client/apps/tasks/pages/TasksPage.ui.xml  |  4 +-
 .../tasks/pages/widgets/AddTaskButton.java    | 63 +++++++++++++++++++
 .../tasks/pages/widgets/AddTaskButton.ui.xml  | 32 ++++++++++
 .../apps/tasks/pages/widgets/TaskItem.java    |  7 ---
 .../apps/tasks/pages/widgets/TaskItem.ui.xml  |  2 +-
 .../silverpeas/mobile/public/components.css   | 28 +++++++++
 .../org/silverpeas/mobile/public/spmobile.css | 47 ++++----------
 9 files changed, 149 insertions(+), 48 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.ui.xml

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 129d6b8b1..648742c2a 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
@@ -101,7 +101,6 @@ public void loadedDataEvent(final DataLoadedEvent event) {
       list.clear();
       if (rights.getWriter() || rights.getPublisher() || rights.getManager()) {
         if (rootAlbumId != null) {
-          //list.add(buttonImport);
           actionsShortcuts.addAction(buttonImport);
         }
       }
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..7d9242c40 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
@@ -28,17 +28,19 @@
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.client.ui.HTMLPanel;
+import org.silverpeas.mobile.client.apps.media.pages.widgets.AddMediaButton;
 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.AddTaskButton;
 import org.silverpeas.mobile.client.apps.tasks.pages.widgets.TaskItem;
 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.ActionsList;
 import org.silverpeas.mobile.client.components.base.PageContent;
 import org.silverpeas.mobile.shared.dto.TaskDTO;
 
@@ -52,11 +54,14 @@ public class TasksPage extends PageContent implements TasksPagesEventHandler {
 
   interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
   private static TasksPageUiBinder uiBinder = GWT.create(TasksPageUiBinder.class);
-
+  private AddTaskButton buttonCreate = new AddTaskButton();
   @UiField HTMLPanel container;
   @UiField
   UnorderedList list;
 
+  @UiField
+  ActionsList actionsShortcuts;
+
   public TasksPage() {
     initWidget(uiBinder.createAndBindUi(this));
     EventBus.getInstance().fireEvent(new TasksLoadEvent());
@@ -66,9 +71,9 @@ public TasksPage() {
   @Override
   public void onTaskLoad(final TasksLoadedEvent event) {
     Notification.activityStop();
+    actionsShortcuts.addAction(buttonCreate);
 
-
-    list.add(new AddTaskItem());
+    //list.add(new AddTaskButton());
 
     Iterator<TaskDTO> i = event.getTasks().iterator();
     while (i.hasNext()) {
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..cfbb3dc50 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,11 @@
 
 <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">
+    <base:ActionsList ui:field="actionsShortcuts"/>
     <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/AddTaskButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.java
new file mode 100644
index 000000000..4f029ef90
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.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.client.apps.tasks.pages.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.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 org.silverpeas.mobile.client.components.base.ActionItem;
+
+/**
+ * @author: svu
+ */
+public class AddTaskButton extends ActionItem {
+
+  interface AddTaskItemUiBinder extends UiBinder<Widget, AddTaskButton> {
+  }
+
+  @UiField Anchor link;
+  @UiField(provided = true) protected TasksMessages msg = null;
+
+  private static AddTaskItemUiBinder uiBinder = GWT.create(AddTaskItemUiBinder.class);
+
+  public AddTaskButton() {
+    msg = GWT.create(TasksMessages.class);
+    initWidget(uiBinder.createAndBindUi(this));
+  }
+
+  @UiHandler("link")
+  void createTask(ClickEvent event) {
+    TaskPage page = new TaskPage();
+    page.setPageTitle(msg.create());
+    page.show();
+  }
+}
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.ui.xml
new file mode 100644
index 000000000..c5917f472
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.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/>.
+  -->
+
+<!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'/>
+
+  <g:HTMLPanel tag="li" ui:field="container" styleName="add-task">
+    <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/tasks/pages/widgets/TaskItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.java
index 515026ba9..65dcffd92 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,7 +25,6 @@
 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;
@@ -87,12 +86,6 @@ 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 edit(ClickEvent event) {
     if (task.getExternalId().isEmpty()) {
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>&nbsp;(<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/public/components.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
index 9efc575c0..28b43e4f9 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
@@ -181,3 +181,31 @@
         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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index b59ca3884..52e366b8b 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
@@ -712,7 +712,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-tasks a {
-  background: transparent url('icons/tasks.svg') 8px -394px no-repeat;
+  background: transparent url('icons/tasks.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-help a {
@@ -780,19 +780,22 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 2.5em
 }
 
-.add-task {
-  background-color: #FDF4EF;
-  border-bottom: 1px solid #EDBCBB;
-  border-top: 1px solid #EDBCBB;
+.tasks #actionsList {
+  top: 12px;
+  right: 1em;
 }
 
-.ui-listview > li.add-task a {
-  background: #FDF4EF none;
-  padding-left: 1em
+.add-task {
+  height: 24px;
+  width: 24px;
+  filter: invert(1);
+  background: url('icons/add.svg') no-repeat;
 }
 
-.ui-listview > li.add-task a::after {
-  background: transparent url('icons/add.svg') no-repeat;
+.add-task a {
+  height: 24px;
+  width: 24px;
+  display: block;
 }
 
 .publication.ui-input-text {
@@ -1957,30 +1960,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;

From 6b60a63ccf4c994f78b0f8a66919bd99f14546e4 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 16 Jan 2024 09:47:47 +0100
Subject: [PATCH 142/228] actions centralisation

---
 .../client/apps/agenda/pages/AgendaPage.java  |  6 +--
 .../apps/agenda/pages/AgendaPage.ui.xml       |  1 -
 .../client/apps/agenda/pages/EventPage.java   | 16 +++----
 .../client/apps/agenda/pages/EventPage.ui.xml |  1 -
 .../widgets/TentativeParticipationButton.java |  1 -
 .../client/apps/blog/pages/BlogPage.java      |  7 +--
 .../client/apps/blog/pages/BlogPage.ui.xml    |  1 -
 .../classifieds/pages/ClassifiedPage.java     |  6 +--
 .../classifieds/pages/ClassifiedPage.ui.xml   |  1 -
 .../classifieds/pages/ClassifiedsPage.java    |  5 +--
 .../classifieds/pages/ClassifiedsPage.ui.xml  |  1 -
 .../documents/pages/GedNavigationPage.java    |  6 +--
 .../documents/pages/GedNavigationPage.ui.xml  |  1 -
 .../apps/documents/pages/PublicationPage.java |  9 ++--
 .../documents/pages/PublicationPage.ui.xml    |  1 -
 .../documents/pages/widgets/ShareButton.java  | 43 +++++++++----------
 .../mobile/client/apps/faq/pages/FaqPage.java |  5 +--
 .../client/apps/faq/pages/FaqPage.ui.xml      |  1 -
 .../formsonline/pages/FormOnlineEditPage.java |  4 --
 .../pages/FormOnlineEditPage.ui.xml           |  1 -
 .../pages/FormOnlineRequestsPage.java         |  3 --
 .../pages/FormOnlineRequestsPage.ui.xml       |  1 -
 .../formsonline/pages/FormOnlineViewPage.java |  4 --
 .../pages/FormOnlineViewPage.ui.xml           |  1 -
 .../pages/FormsOnlineAsReceiverPage.java      |  3 --
 .../pages/FormsOnlineAsReceiverPage.ui.xml    |  1 -
 .../formsonline/pages/FormsOnlinePage.java    |  9 ++--
 .../formsonline/pages/FormsOnlinePage.ui.xml  |  1 -
 .../pages/widgets/ViewMyRequestsButton.java   |  1 -
 .../apps/media/pages/MediaNavigationPage.java | 17 +++-----
 .../media/pages/MediaNavigationPage.ui.xml    |  2 -
 .../client/apps/media/pages/PhotoPage.java    |  9 ++--
 .../client/apps/media/pages/PhotoPage.ui.xml  |  2 -
 .../client/apps/media/pages/SoundPage.java    |  8 ++--
 .../client/apps/media/pages/SoundPage.ui.xml  |  1 -
 .../client/apps/media/pages/VideoPage.java    |  8 ++--
 .../client/apps/media/pages/VideoPage.ui.xml  |  1 -
 .../apps/media/pages/VideoStreamingPage.java  |  9 ++--
 .../media/pages/VideoStreamingPage.ui.xml     |  1 -
 .../apps/navigation/pages/NavigationPage.java |  5 +--
 .../navigation/pages/NavigationPage.ui.xml    |  1 -
 .../client/apps/news/pages/NewsPage.java      |  6 +--
 .../client/apps/news/pages/NewsPage.ui.xml    |  1 -
 .../pages/NotificationsBoxPage.java           |  7 +--
 .../pages/NotificationsBoxPage.ui.xml         |  1 -
 .../pages/ReservationDetailPage.java          | 13 +-----
 .../pages/ReservationDetailPage.ui.xml        |  1 -
 .../pages/ResourcesManagerPage.java           |  8 +---
 .../pages/ResourcesManagerPage.ui.xml         |  1 -
 .../pages/widgets/AddReservationButton.java   |  3 --
 .../widgets/DeleteReservationButton.java      |  2 -
 .../apps/sharesbox/pages/SharesBoxPage.java   |  6 +--
 .../apps/sharesbox/pages/SharesBoxPage.ui.xml |  1 -
 .../client/apps/survey/pages/SurveyPage.java  |  4 --
 .../apps/survey/pages/SurveyPage.ui.xml       |  1 -
 .../client/apps/survey/pages/SurveysPage.java |  5 +--
 .../apps/survey/pages/SurveysPage.ui.xml      |  1 -
 .../client/apps/tasks/pages/TasksPage.java    |  6 +--
 .../pages/WorkflowActionFormPage.java         |  3 --
 .../pages/WorkflowActionFormPage.ui.xml       |  1 -
 .../apps/workflow/pages/WorkflowPage.java     | 11 ++---
 .../apps/workflow/pages/WorkflowPage.ui.xml   |  1 -
 .../pages/WorkflowPresentationPage.java       |  5 +--
 .../pages/WorkflowPresentationPage.ui.xml     |  1 -
 .../client/components/base/ActionsList.java   |  5 +++
 .../client/components/base/ActionsMenu.java   | 10 +++++
 .../mobile/client/components/base/Page.java   |  3 ++
 .../client/components/base/PageContent.java   | 34 ++++++++++++++-
 .../client/components/base/PageHeader.java    | 23 ++++++++++
 .../client/components/base/PageHeader.ui.xml  |  9 ++--
 .../components/base/widgets/ShareButton.java  |  2 -
 .../org/silverpeas/mobile/public/spmobile.css |  7 ++-
 72 files changed, 158 insertions(+), 229 deletions(-)

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..ea71e303c 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
@@ -48,7 +48,6 @@
 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.shared.dto.ContentsTypes;
 import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO;
@@ -67,9 +66,6 @@ public class AgendaPage extends PageContent implements AgendaPagesEventHandler {
 
   @UiField(provided = true) protected AgendaMessages msg = null;
 
-  @UiField
-  ActionsMenu actionsMenu;
-
   @UiField
   UnorderedList events;
 
@@ -215,7 +211,7 @@ public void onCalendarEventsLoaded(final CalendarLoadedEvent event) {
     } else {
       message.setInnerText(msg.noEvent());
     }
-    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/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/EventPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EventPage.java
index f36b0d447..dae0f0602 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
@@ -69,7 +69,6 @@
 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.shared.dto.almanach.CalendarDTO;
 import org.silverpeas.mobile.shared.dto.almanach.CalendarEventAttendeeDTO;
@@ -114,9 +113,6 @@ public class EventPage  extends PageContent implements EventPagesEventHandler {
   @UiField
   UnorderedList attachments, attendees;
 
-  @UiField
-  ActionsMenu actionsMenu;
-
   private CalendarEventDTO event;
   private CalendarDTO calendar;
   private ReminderDTO reminderDTO;
@@ -237,9 +233,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 +251,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..e81da70b1 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,7 +31,6 @@
   <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>
 
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 9aa5fe33c..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,7 +29,6 @@
 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;
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 949cf2b53..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
@@ -42,7 +42,6 @@
 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;
@@ -64,8 +63,6 @@ public class BlogPage extends PageContent implements BlogPagesEventHandler {
   @UiField
   UnorderedList news;
   @UiField
-  ActionsMenu actionsMenu;
-  @UiField
   ListBox categories;
 
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
@@ -132,9 +129,9 @@ public int compare(Map.Entry<String, String> o1,
     }
     categories.setSelectedIndex(oldSelection);
 
-    actionsMenu.addAction(favorite);
+    addActionMenu(favorite);
     favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), getPageTitle());
-    actionsMenu.addAction(share);
+    addActionMenu(share);
     share.init(getPageTitle(), getPageTitle(), LinksManager.createApplicationPermalink(instanceId));
   }
 
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..c49ab8996 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,7 +31,6 @@
   <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>
     <components:UnorderedList ui:field="news" styleName="liste-billet"/>
   </g:HTMLPanel>
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..b7a27a9e1 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,7 +31,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 class="content-navigation">
       <span class="ui-btn-text"><ui:text from="{msg.category}"/></span>
       <g:ListBox ui:field="categories"/>
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..216394723 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
@@ -44,7 +44,6 @@
 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.shared.dto.BaseDTO;
 import org.silverpeas.mobile.shared.dto.ContentDTO;
@@ -59,7 +58,6 @@ public class GedNavigationPage extends PageContent implements View, GedNavigatio
   private DocumentsMessages msg;
 
   @UiField UnorderedList list;
-  @UiField ActionsMenu actionsMenu;
 
   private TopicDTO root;
   private String rootTopicId, instanceId;
@@ -112,7 +110,7 @@ public void onLoadedTopics(GedItemsLoadedEvent event) {
       }
       dataLoaded = true;
 
-      actionsMenu.addAction(favorite);
+      addActionMenu(favorite);
 
       if (root.getId() == null) {
         favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), root.getName());
@@ -122,7 +120,7 @@ public void onLoadedTopics(GedItemsLoadedEvent event) {
 
       if (event.getSharing() > 0) {
         share.init(event.getSharing(), instanceId, root.getId(),"Node", "","");
-        actionsMenu.addAction(share);
+        addActionMenu(share);
       }
 
       Notification.activityStop();
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..72a5a68b3 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
@@ -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"/>
   </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 f8a43ea20..1b2232e1f 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
@@ -60,7 +60,6 @@
 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.shared.dto.ContentDTO;
 import org.silverpeas.mobile.shared.dto.ContentsTypes;
@@ -92,8 +91,6 @@ public class PublicationPage extends PageContent
   Anchor contentLink;
   @UiField
   DivElement content;
-  @UiField
-  ActionsMenu actionsMenu;
 
   @UiField(provided = true)
   protected DocumentsMessages msg;
@@ -165,15 +162,15 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
     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);
     }
 
     if (Boolean.parseBoolean(ResourcesManager.getParam("content.display.embedded")) && publication.getContent()) {
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 dd3d0b0ce..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
@@ -32,7 +32,6 @@
 
   <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>
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 2253db70f..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
@@ -22,21 +22,20 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-package org.silverpeas.mobile.client.components.base.widgets;
+package org.silverpeas.mobile.client.apps.documents.pages.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.Window;
 import com.google.gwt.user.client.ui.Anchor;
 import com.google.gwt.user.client.ui.HTMLPanel;
-import org.silverpeas.mobile.client.apps.favorites.resources.FavoritesMessages;
-import org.silverpeas.mobile.client.common.Html5Utils;
+import org.silverpeas.mobile.client.apps.documents.pages.SharingPage;
+import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages;
 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
@@ -50,34 +49,34 @@ interface ShareButtonUiBinder extends UiBinder<HTMLPanel, ShareButton> {
     @UiField  HTMLPanel container;
     @UiField  Anchor share;
 
-    @UiField(provided = true) protected ApplicationMessages msg = null;
-    private String title, text, url;
+    @UiField(provided = true) protected DocumentsMessages msg = null;
+    private String instanceId, contentId, contentType, title, pageTitle;
+
+    private int shareLevel;
 
     public ShareButton() {
-        msg = GWT.create(ApplicationMessages.class);
+        msg = GWT.create(DocumentsMessages.class);
         initWidget(uiBinder.createAndBindUi(this));
         setId("share");
     }
-    public void init(String title, String text, String url) {
+
+    public void init(int shareLevel, String instanceId, String contentId, String contentType, String title, String pageTitle) {
+        this.instanceId = instanceId;
+        this.contentId = contentId;
+        this.contentType = contentType;
         this.title = title;
-        this.text = text;
-        this.url = url;
-        try {
-            if (!Html5Utils.canShare(title, text, url)) {
-                setVisible(false);
-            }
-        } catch(Throwable t) {
-            setVisible(false);
-        }
+        this.pageTitle = pageTitle;
+        this.shareLevel = shareLevel;
     }
+
     @UiHandler("share")
-    void share(ClickEvent event) {
-        Html5Utils.share(title, text, url);
+    void displaySharePage(ClickEvent event) {
+        SharingPage page = new SharingPage();
+        page.setData(contentType, contentId, instanceId);
+        page.show();
 
         // hide menu
         ActionsMenu.close(getElement());
     }
 
-
-
 }
\ No newline at end of file
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 21434f329..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,7 +31,6 @@
   <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" stylePrimaryName="faq-categories"/></div>
     <components:UnorderedList ui:field="faqs" styleName="forms-list"/>
   </g:HTMLPanel>
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..bccf8c1a1 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;
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 e0d59745a..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,7 +31,6 @@
 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;
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 648742c2a..e11c7defd 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
@@ -30,6 +30,7 @@
 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;
@@ -46,10 +47,7 @@
 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.ActionsList;
-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;
@@ -60,6 +58,7 @@
 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 {
@@ -68,9 +67,6 @@ public class MediaNavigationPage extends PageContent implements View, MediaNavig
   @UiField UnorderedList list;
   private AddMediaButton buttonImport = new AddMediaButton();
   private LoadingItem endline = new LoadingItem();
-  @UiField ActionsMenu actionsMenu;
-  @UiField ActionsList actionsShortcuts;
-
   private String rootAlbumId, instanceId;
   private RightDTO rights;
   private AlbumDTO root;
@@ -101,15 +97,12 @@ public void loadedDataEvent(final DataLoadedEvent event) {
       list.clear();
       if (rights.getWriter() || rights.getPublisher() || rights.getManager()) {
         if (rootAlbumId != null) {
-          actionsShortcuts.addAction(buttonImport);
+          addActionShortcut(buttonImport);
         }
       }
       List<BaseDTO> dataItems = event.getData();
       populateList(dataItems);
       list.add(endline);
-
-      actionsMenu.addAction(favorite);
-      actionsMenu.addAction(share);
       if (root.getId() == null) {
         favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), root.getName());
         share.init(root.getName(), root.getName(), LinksManager.createApplicationPermalink(instanceId));
@@ -117,6 +110,8 @@ public void loadedDataEvent(final DataLoadedEvent event) {
         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 52c6aabab..72a5a68b3 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,8 +29,6 @@
              xmlns:components="urn:import:org.silverpeas.mobile.client.components">
 
   <g:HTMLPanel styleName="content">
-    <base:ActionsList ui:field="actionsShortcuts"/>
-    <base:ActionsMenu ui:field="actionsMenu"/>
     <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/media/pages/PhotoPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/PhotoPage.java
index b7b19d238..affcbf54c 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
@@ -60,7 +60,6 @@
 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;
@@ -85,8 +84,6 @@ interface PhotoPageUiBinder extends UiBinder<HTMLPanel, PhotoPage> {
   CommentsButton comments;
   @UiField DivElement previewContainer;
 
-  @UiField ActionsMenu actionsMenu;
-
   private NotifyButton notification = new NotifyButton();
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
 
@@ -165,13 +162,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());
-      actionsMenu.addAction(share);
+      addActionMenu(share);
     }
   }
 
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..89bc85854 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">
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 8af2cca05..928c4a982 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
@@ -62,7 +62,6 @@
 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;
@@ -88,7 +87,6 @@ interface SoundPageUiBinder extends UiBinder<HTMLPanel, SoundPage> {
   @UiField AudioElement player;
   @UiField CommentsButton comments;
   @UiField DivElement previewContainer;
-  @UiField ActionsMenu actionsMenu;
 
   private NotifyButton notification = new NotifyButton();
   private ShareButton share = new ShareButton();
@@ -152,13 +150,13 @@ 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()));
-      actionsMenu.addAction(share);
+      addActionMenu(share);
     }
   }
 
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..cfb4940c7 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,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">
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 b3bad79c7..7674864a8 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
@@ -65,7 +65,6 @@
 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;
@@ -91,7 +90,6 @@ interface VideoPageUiBinder extends UiBinder<HTMLPanel, VideoPage> {
   @UiField CommentsButton comments;
   @UiField VideoElement player;
   @UiField DivElement previewContainer;
-  @UiField ActionsMenu actionsMenu;
 
   private NotifyButton notification = new NotifyButton();
   private ShareButton share = new ShareButton();
@@ -171,13 +169,13 @@ 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);
       }
       share.init(video.getTitle(),video.getTitle(), LinksManager.createMediaPermalink(video.getId()));
-      actionsMenu.addAction(share);
+      addActionMenu(share);
     }
   }
 
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..45d7b4f24 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">
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 b1cbf9395..6646fc28a 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
@@ -56,7 +56,6 @@
 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;
@@ -83,8 +82,6 @@ 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();
@@ -133,13 +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()));
-      actionsMenu.addAction(share);
+      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..5382904e5 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">
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..95275f6be 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();
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/news/pages/NewsPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/pages/NewsPage.java
index 39f1caafe..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
@@ -38,7 +38,6 @@
 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;
@@ -52,7 +51,6 @@ 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();
@@ -88,9 +86,9 @@ public void onNewsLoad(final NewsLoadedEvent event) {
       instanceId = newsDTO.getInstanceId();
       i++;
     }
-    actionsMenu.addAction(favorite);
+    addActionMenu(favorite);
     favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), getPageTitle());
-    actionsMenu.addAction(share);
+    addActionMenu(share);
     share.init(getPageTitle(), getPageTitle(), LinksManager.createApplicationPermalink(instanceId));
   }
 
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/notificationsbox/pages/NotificationsBoxPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/NotificationsBoxPage.java
index f28d115b6..e92c5b261 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
@@ -42,7 +42,6 @@
 import org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets.NotificationItem;
 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.resources.ApplicationMessages;
 import org.silverpeas.mobile.shared.dto.notifications.NotificationBoxDTO;
@@ -63,8 +62,6 @@ public class NotificationsBoxPage extends PageContent implements NotificationsBo
   @UiField
   Anchor notificationReceived, notificationSended;
 
-  @UiField
-  ActionsMenu actionsMenu;
 
   private DeleteButton delete = new DeleteButton();
   private MarkAsReadButton notRead = new MarkAsReadButton();
@@ -80,8 +77,8 @@ public NotificationsBoxPage() {
     EventBus.getInstance().fireEvent(new NotificationsLoadEvent());
     delete.setParentPage(this);
     notRead.setParentPage(this);
-    actionsMenu.addAction(delete);
-    actionsMenu.addAction(notRead);
+    addActionMenu(delete);
+    addActionMenu(notRead);
   }
 
   @Override
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/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 31bb17510..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,11 +7,8 @@
 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;
 
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 0c0a85428..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,10 +9,8 @@
 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;
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..c23567afb 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
@@ -36,7 +36,6 @@
 import org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages;
 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.tickets.TicketDTO;
 
@@ -51,9 +50,6 @@ 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();
@@ -101,7 +97,7 @@ public SharesBoxPage() {
     shares.getElement().setId("shares");
     EventBus.getInstance().addHandler(AbstractSharesBoxPagesEvent.TYPE, this);
     delete.setParentPage(this);
-    actionsMenu.addAction(delete);
+    addActionMenu(delete);
   }
 
   @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..5bb8c953e 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
@@ -31,7 +31,6 @@
   <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"/>
 
     <components:UnorderedList ui:field="shares" stylePrimaryName="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/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/pages/TasksPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.java
index 7d9242c40..649710a8b 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
@@ -28,7 +28,6 @@
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.client.ui.HTMLPanel;
-import org.silverpeas.mobile.client.apps.media.pages.widgets.AddMediaButton;
 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;
@@ -71,10 +70,7 @@ public TasksPage() {
   @Override
   public void onTaskLoad(final TasksLoadedEvent event) {
     Notification.activityStop();
-    actionsShortcuts.addAction(buttonCreate);
-
-    //list.add(new AddTaskButton());
-
+    addActionShortcut(buttonCreate);
     Iterator<TaskDTO> i = event.getTasks().iterator();
     while (i.hasNext()) {
       TaskDTO task = i.next();
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 0368a0ea4..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
@@ -31,7 +31,6 @@
 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.FlexTable;
 import com.google.gwt.user.client.ui.ListBox;
@@ -47,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;
@@ -63,8 +61,6 @@ public class WorkflowPage extends PageContent implements WorkflowPagesEventHandl
   @UiField
   FlexTable instances;
   @UiField
-  ActionsMenu actionsMenu;
-  @UiField
   ListBox roles;
 
   private String instanceId;
@@ -96,7 +92,6 @@ public void loadDataInstances(final WorkflowLoadedDataEvent event) {
       roles.addItem(role.getValue(), role.getKey());
     }
     roles.setVisible(roles.getItemCount()>1);
-
     EventBus.getInstance().fireEvent(new WorkflowRoleChangeEvent(roles.getSelectedValue()));
   }
 
@@ -146,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/components/base/ActionsList.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/ActionsList.java
index fb2b0353a..1c67a9a6e 100644
--- 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
@@ -66,6 +66,11 @@ public void addAction(ActionItem action) {
         container.getElement().getStyle().setDisplay(Style.Display.BLOCK);
     }
 
+    public void clear() {
+        listActions.clear();
+        container.getElement().getStyle().setDisplay(Style.Display.NONE);
+    }
+
     public void removeAction(String id, boolean silently) {
       for (int i = 0; i < listActions.getWidgetCount(); i++) {
         ActionItem act = (ActionItem) listActions.getWidget(i);
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 d574dbe39..11bac95d2 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
@@ -79,6 +79,11 @@ public static void close(Element action) {
         action.getParentElement().addClassName("closed-qvf-menu");
     }
 
+    public void close() {
+        listActions.getElement().removeClassName("open-qvf-menu");
+        listActions.getElement().addClassName("closed-qvf-menu");
+    }
+
     public boolean isEmpty() {
         return (listActions.getWidgetCount() == 0);
     }
@@ -92,6 +97,11 @@ public void addAction(ActionItem action) {
         container.getElement().getStyle().setDisplay(Style.Display.BLOCK);
     }
 
+    public void clear() {
+        listActions.clear();
+        container.getElement().getStyle().setDisplay(Style.Display.NONE);
+    }
+
     public void removeAction(String id, boolean silently) {
       for (int i = 0; i < listActions.getWidgetCount(); i++) {
         ActionItem act = (ActionItem) listActions.getWidget(i);
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 3b4fd4560..350866f50 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
@@ -140,6 +140,9 @@ public int getHeaderHeight() {
   }
   public int getFooterHeight() { return footer.getOffsetHeight() ; }
 
+  public PageHeader getHeader() {
+    return header;
+  }
   public void showOfflineIndicator() {
     header.showOfflineIndicator();
   }
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..7eabf4035 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
@@ -33,6 +33,7 @@
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.Event.NativePreviewEvent;
 import com.google.gwt.user.client.Event.NativePreviewHandler;
+import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Composite;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.common.EventBus;
@@ -49,6 +50,9 @@
 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;
@@ -56,6 +60,8 @@ public abstract class PageContent extends Composite implements View, NativePrevi
   protected String pageTitle;
   private HandlerRegistration registration;
   private SwipeRecognizer swipeRecognizer;
+  private List<ActionItem> actionsMenu = new ArrayList<>();
+  private List<ActionItem> actionsShortcuts = new ArrayList<>();
 
   public PageContent() {
     super();
@@ -87,6 +93,21 @@ public void show() {
     PageHistory.getInstance().goTo(this);
   }
 
+  public void addActionShortcut(ActionItem action) {
+    actionsShortcuts.add(action);
+    SpMobil.getMainPage().getHeader().addActionShortcut(action);
+  }
+
+  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 +135,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,7 +190,6 @@ 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
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 784d408dd..ecce4202c 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
@@ -41,6 +41,10 @@ public class PageHeader extends Composite {
 
   private static PageHeaderUiBinder uiBinder = GWT.create(PageHeaderUiBinder.class);
 
+  public void closeMenuQVF() {
+    actionsMenu.close();
+  }
+
   interface PageHeaderUiBinder extends UiBinder<Widget, PageHeader> {
   }
 
@@ -48,6 +52,8 @@ interface PageHeaderUiBinder extends UiBinder<Widget, PageHeader> {
   @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;
 
@@ -61,6 +67,23 @@ public PageHeader() {
     title.setInnerText(ResourcesManager.getLabel("mainpage.title"));
   }
 
+  public void addActionShortcut(ActionItem action) {
+    actionsShortcuts.addAction(action);
+  }
+
+  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();
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 67b6fff74..e9fa8e620 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,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">
+<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'/>
 
@@ -35,8 +37,9 @@
         <span></span>
       </g:HTML>
     </div>
-
-    <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 back" text=""/>
+    <h1 ui:field="title" class="ui-title">Silverpeas</h1>
+    <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/components/base/widgets/ShareButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/ShareButton.java
index 2253db70f..3681836fc 100644
--- 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
@@ -29,10 +29,8 @@
 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.favorites.resources.FavoritesMessages;
 import org.silverpeas.mobile.client.common.Html5Utils;
 import org.silverpeas.mobile.client.components.base.ActionItem;
 import org.silverpeas.mobile.client.components.base.ActionsMenu;
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 52e366b8b..39374a828 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
@@ -1997,8 +1997,8 @@ form .forms .fields > li:nth-child(even) {
 
 #actions {
   position: absolute;
-  top: -44px;
   right: 0.5em;
+  top: 11px;
   filter: invert(1);
   z-index: 9999;
 }
@@ -2009,7 +2009,6 @@ form .forms .fields > li:nth-child(even) {
   width: 16px;
   height: 24px;
   text-indent: -3000px;
-  top: 1em;
   right: 0.5em;
   background: transparent url("qvf.svg") 0 0 no-repeat;
   outline: none;
@@ -2021,7 +2020,7 @@ form .forms .fields > li:nth-child(even) {
 #action-bloc {
   border: 0;
   position: absolute;
-  top: 46px;
+  top: 37px;
   right: 0.1em;
   padding: 0;
   margin: 0;
@@ -2046,7 +2045,7 @@ form .forms .fields > li:nth-child(even) {
 
 #actionsList {
   position: absolute;
-  top: -31px;
+  top: 11px;
   right: 4em;
   z-index: 9999;
 }

From a3205afdbcfd8fae0795d43751aa68a373354b68 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 16 Jan 2024 10:56:04 +0100
Subject: [PATCH 143/228] actions adjustements

---
 .../mobile/client/components/base/NavigationMenu.java      | 1 +
 .../main/java/org/silverpeas/mobile/public/spmobile.css    | 7 +++++--
 2 files changed, 6 insertions(+), 2 deletions(-)

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 776a9d0d8..fca5b1943 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
@@ -177,6 +177,7 @@ protected void goHome(ClickEvent event) {
 
   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);
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 39374a828..bbdeca5d8 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
@@ -780,8 +780,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 2.5em
 }
 
-.tasks #actionsList {
-  top: 12px;
+#actionsList:has(.add-task) {
   right: 1em;
 }
 
@@ -1577,6 +1576,10 @@ input.filter-contacts {
   border-radius: 10px;
 }
 
+.btn-validate {
+  text-transform: uppercase;
+}
+
 .ui-page-theme-a .btn-validate {
   background-color: #6fa800;
   background: linear-gradient(#7eb73a, #6fa800) repeat scroll 0 0 #6fa800;

From 91749d53c301751448f7817a022524be32c6cc1b Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 16 Jan 2024 12:22:08 +0100
Subject: [PATCH 144/228] graphicales notifications adjustements

---
 .../pages/NotificationSenderPage.ui.xml       |  2 +-
 .../mobile/public/icons/peoples.svg           |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 20 ++++++++++++++++---
 3 files changed, 19 insertions(+), 4 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/peoples.svg

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..24e686ad5 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
@@ -49,7 +49,7 @@
         <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/public/icons/peoples.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/peoples.svg
new file mode 100644
index 000000000..0d0dbf821
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index bbdeca5d8..f703078d5 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
@@ -428,6 +428,10 @@ 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: black;
@@ -1429,15 +1433,19 @@ li > #operations {
 }
 
 #edit-notification .ui-input-text.destinataires {
-  background: #FFF url(packPictos.png) 13px -234px no-repeat;
+  background: #FFF url('icons/peoples.svg') no-repeat;
   padding-left: 4em;
   line-height: 1.4em;
   position: relative;
-  color: #AAA;
+  color: #000;
   font-size: 80%;
   min-height: 3.4em;
 }
 
+#edit-notification #message {
+  height: 15em;
+}
+
 #edit-notification .ui-input-text.destinataires .nb-user-sectionne {
   position: absolute;
   top: 1em;
@@ -1451,7 +1459,7 @@ li > #operations {
   top: 0.1em;
   right: 0.1em;
   bottom: 0.1em;
-  background: #7eb73a url(packPictos.png) 0.5em 0.5em no-repeat;
+  /*background: #7eb73a url(packPictos.png) 0.5em 0.5em no-repeat;*/
   display: block;
   text-indent: -300em;
   width: 2em;
@@ -1486,6 +1494,10 @@ li > #operations {
   font-size: 80%;
 }
 
+#edit-notification .ui-input-text.publication {
+  background: url('icons/publication.svg') no-repeat #ffff;
+}
+
 .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 {
   float: none;
   clear: inherit;
@@ -1578,6 +1590,8 @@ input.filter-contacts {
 
 .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 {

From 487cd84f57600d6240cb41ff6f7a11223428d706 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 16 Jan 2024 14:12:37 +0100
Subject: [PATCH 145/228] best back button render on click

---
 .../silverpeas/mobile/client/components/base/PageHeader.ui.xml  | 2 +-
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

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 e9fa8e620..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
@@ -37,7 +37,7 @@
         <span></span>
       </g:HTML>
     </div>
-    <g:Anchor ui:field="back" styleName="ui-btn-right ui-btn-corner-all ui-btn ui-icon-grid back" text=""/>
+    <g:Anchor ui:field="back" styleName="ui-btn-right back" text=""/>
     <h1 ui:field="title" class="ui-title">Silverpeas</h1>
     <base:ActionsList ui:field="actionsShortcuts"/>
     <base:ActionsMenu ui:field="actionsMenu"/>
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 f703078d5..7b9cdaff4 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
@@ -498,7 +498,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 .ui-btn-right.back {
   background: url('icons/arrow_back.svg') no-repeat;
   border: none;
-  height: 44px;
+  height: 36px;
   width: 36px;
   margin: 3px 0 0 0;
   padding: 0 0 0 0;

From c328bb56ed20d9c60fa55bc73d6b14e49c80c00e Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 18 Jan 2024 15:16:37 +0100
Subject: [PATCH 146/228] add ripple animation

---
 .../mobile/client/common/Html5Utils.java      | 13 +++++++
 .../common/animation/RippleAnimation.java     | 34 +++++++++++++++++++
 .../client/components/base/PageFooter.java    | 12 ++++++-
 .../silverpeas/mobile/public/animations.css   | 28 +++++++++++++++
 .../org/silverpeas/mobile/public/spmobile.css |  1 +
 5 files changed, 87 insertions(+), 1 deletion(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/common/animation/RippleAnimation.java

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 01de7117a..5a17bab77 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
@@ -27,6 +27,7 @@
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.user.client.Window;
+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;
@@ -37,6 +38,17 @@
  */
 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();
@@ -185,4 +197,5 @@ public static native void share(String title, String text, String url) /*-{
     };
     $wnd.navigator.share(shareData);
   }-*/;
+
 }
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/components/base/PageFooter.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageFooter.java
index 29d839ec2..37768a596 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;
@@ -83,27 +86,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/public/animations.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css
index 960b5665a..c81d45d74 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/animations.css
@@ -18,3 +18,31 @@
     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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 7b9cdaff4..a9ec8815f 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
@@ -512,6 +512,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 .ui-page-content {
   padding: 0;
+  min-height: 100vh;
 }
 
 #menu-principal {

From 7bc097f603b43be58359eaa15b1ffcc42ce9e308 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 18 Jan 2024 16:53:14 +0100
Subject: [PATCH 147/228] Fix back navigation

---
 .../silverpeas/mobile/client/common/navigation/PageHistory.java  | 1 +
 1 file changed, 1 insertion(+)

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 62d02ade9..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
@@ -145,6 +145,7 @@ private void back(String token) {
             page.stop();
             page = pages.peek();
             SpMobil.getMainPage().setContent(page, false);
+            page.setVisible(true);
           } else {
             SpMobil.restoreMainPage();
           }

From 263d71a4cd2eaa82f6066de5064cc3793996b490 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 22 Jan 2024 18:59:50 +0100
Subject: [PATCH 148/228] improve medias render

---
 .../media/pages/MediaNavigationPage.ui.xml    |  2 +-
 .../client/apps/media/pages/VideoPage.java    |  5 +--
 .../client/apps/media/pages/VideoPage.ui.xml  | 12 ++++--
 .../apps/media/pages/VideoStreamingPage.java  |  4 +-
 .../media/pages/VideoStreamingPage.ui.xml     | 12 ++++--
 .../apps/media/pages/widgets/MediaItem.java   |  4 +-
 .../components/attachments/Attachment.ui.xml  | 10 +++--
 .../resources/ApplicationResources.java       |  6 ---
 .../silverpeas/mobile/public/components.css   |  2 +-
 .../icons/files/file-type-video-ondemand.svg  |  1 +
 .../public/icons/files/file-type-video.svg    |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 38 ++++++++-----------
 12 files changed, 50 insertions(+), 47 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video-ondemand.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-video.svg

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 72a5a68b3..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,6 +29,6 @@
              xmlns:components="urn:import:org.silverpeas.mobile.client.components">
 
   <g:HTMLPanel styleName="content">
-    <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/VideoPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoPage.java
index 7674864a8..e825c4043 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
@@ -61,6 +61,7 @@
 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;
@@ -142,9 +143,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());
 
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 45d7b4f24..83a284f54 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
@@ -39,10 +39,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/VideoStreamingPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/VideoStreamingPage.java
index 6646fc28a..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
@@ -52,6 +52,7 @@
 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;
@@ -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());
 
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 5382904e5..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
@@ -38,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/MediaItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java
index d0dea1c48..09febc23d 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;
@@ -82,7 +84,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/components/attachments/Attachment.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.ui.xml
index 06b04e267..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
@@ -27,9 +27,13 @@
              xmlns:g="urn:import:com.google.gwt.user.client.ui">
   <g:HTMLPanel tag="li">
     <g:Anchor ui:field="link" styleName="expand-more" href="javascript:;">
-      <img ui:field="icon" src=""/>
-      <span ui:field="name"></span><span ui:field="size" class="weight"></span>
-      <span ui:field="description"></span>
+      <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:HTMLPanel ui:field="operations" stylePrimaryName="ops-closed">
       <g:HTML ui:field="notify"></g:HTML>
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..bf0c0521b 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
@@ -41,12 +41,6 @@ public interface ApplicationResources extends ClientBundle {
   @Source("sound.png")
   ImageResource sound();
 
-  @Source("video.png")
-  ImageResource video();
-
-  @Source("streaming.png")
-  ImageResource streaming();
-
   @Source("offline.png")
   ImageResource offline();
 }
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
index 28b43e4f9..005698838 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
@@ -65,7 +65,7 @@
 #header > div > div > span {
     display: block;
     width: 100%;
-    box-shadow: 0 2px 10px 0 rgba(0,0,0,0.3);
+        box-shadow: 0 2px 10px 0 rgba(0,0,0,0.3);
     border-radius: 2em;
     height: 4px;
     background: #fff;
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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index a9ec8815f..dbfd7947d 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
@@ -926,33 +926,36 @@ 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;
+
 }
 
 .info-nb-sous-elmt {
@@ -1259,30 +1262,23 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 #attachments li a {
   text-decoration: none;
   color: #000;
+  display: flex;
 }
 
 #attachments li a .weight {
   display: block;
-  padding-left: 24px;
   color: #848484;
-  margin-left: 8px;
 }
 
 #a-media #attachments li a .dimension {
   display: block;
   color: #848484;
   padding-left: 0px;
-  margin-left: calc(1em + 24px);
 }
 
 #a-media #attachments li a .weight {
   display: inline-block;
   padding-left: 0px;
-  margin-left: calc(1em + 24px);
-}
-
-#a-media #attachments li a img {
-  margin-left: 0.5em;
 }
 
 #attachments li a img {
@@ -1296,13 +1292,11 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #attachments li a.expand-more {
 	background: transparent url(icons/expand_more.svg) right 1em no-repeat;
-	display: block;
 	margin-right: 0.5em;
 }
 
 #attachments li a.expand-less {
   background: transparent url(icons/expand_less.svg) right 1em no-repeat;
-  display: block;
   margin-right: 0.5em;
 }
 

From b5040dadf9f256f3bbcf1e330f9f7baaac5be38b Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 23 Jan 2024 15:41:43 +0100
Subject: [PATCH 149/228] enhance attchment and media render

---
 .../client/apps/media/pages/PhotoPage.java    |  33 ++++++++++++++++-
 .../client/apps/media/pages/PhotoPage.ui.xml  |  18 +++++++---
 .../client/apps/media/pages/SoundPage.java    |  30 +++++++++++++---
 .../client/apps/media/pages/SoundPage.ui.xml  |  19 ++++++----
 .../client/apps/media/pages/VideoPage.java    |  34 +++++++++++++++---
 .../client/apps/media/pages/VideoPage.ui.xml  |   5 ++-
 .../apps/media/pages/widgets/MediaItem.java   |   3 +-
 .../resources/ApplicationResources.java       |   3 --
 .../mobile/client/resources/sound.png         | Bin 2057 -> 0 bytes
 .../mobile/client/resources/streaming.png     | Bin 3106 -> 0 bytes
 .../mobile/client/resources/video.png         | Bin 2438 -> 0 bytes
 .../public/icons/files/file-type-sound.svg    |   1 +
 .../org/silverpeas/mobile/public/spmobile.css |  19 +++++-----
 13 files changed, 132 insertions(+), 33 deletions(-)
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/sound.png
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/streaming.png
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/video.png
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/files/file-type-sound.svg

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 affcbf54c..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,6 +38,7 @@
 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 org.silverpeas.mobile.client.apps.comments.pages.widgets.CommentsButton;
 import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton;
@@ -76,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;
@@ -84,6 +85,10 @@ interface PhotoPageUiBinder extends UiBinder<HTMLPanel, PhotoPage> {
   CommentsButton comments;
   @UiField DivElement previewContainer;
 
+  @UiField HTML view;
+
+  @UiField HTMLPanel operations;
+
   private NotifyButton notification = new NotifyButton();
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
 
@@ -99,6 +104,9 @@ public PhotoPage() {
     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() {
@@ -135,6 +143,7 @@ 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());
       mediaType.setSrc(NetworkHelper.getContext() + "icons/files/file-type-image.svg");
       mediaTitle.setInnerHTML(photo.getTitle());
@@ -187,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 89bc85854..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
@@ -38,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 928c4a982..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
@@ -58,6 +58,7 @@
 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;
@@ -80,7 +81,7 @@ 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;
@@ -88,6 +89,8 @@ interface SoundPageUiBinder extends UiBinder<HTMLPanel, SoundPage> {
   @UiField CommentsButton comments;
   @UiField DivElement previewContainer;
 
+  @UiField HTMLPanel operations;
+
   private NotifyButton notification = new NotifyButton();
   private ShareButton share = new ShareButton();
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
@@ -101,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
@@ -114,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);
@@ -126,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());
 
@@ -160,6 +165,23 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) {
     }
   }
 
+  @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");
+    }
+  }
+
   @UiHandler("download")
   void download(ClickEvent event) {
     if (sound.getDownload()) {
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 cfb4940c7..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
@@ -32,19 +32,26 @@
 
       <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 e825c4043..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;
@@ -84,7 +85,7 @@ 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;
@@ -92,8 +93,11 @@ interface VideoPageUiBinder extends UiBinder<HTMLPanel, VideoPage> {
   @UiField VideoElement player;
   @UiField DivElement previewContainer;
 
+  @UiField
+  HTMLPanel operations;
+
   private NotifyButton notification = new NotifyButton();
-  private ShareButton share = new ShareButton();
+  private ShareButton shareBtn = new ShareButton();
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
 
   private static VideoPageUiBinder uiBinder = GWT.create(VideoPageUiBinder.class);
@@ -107,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() {
@@ -120,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);
@@ -173,8 +182,25 @@ public void onClick(final ClickEvent clickEvent) {
         notification.init(video.getInstance(), video.getId(), NotificationDTO.TYPE_VIDEO, video.getName(), getPageTitle());
         addActionMenu(notification);
       }
-      share.init(video.getTitle(),video.getTitle(), LinksManager.createMediaPermalink(video.getId()));
-      addActionMenu(share);
+      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 83a284f54..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
@@ -38,7 +38,7 @@
       <widgets:CommentsButton ui:field="comments"/>
       <ul id="attachments">
         <li>
-          <g:Anchor ui:field="download" styleName="downloadable">
+          <g:Anchor ui:field="link" styleName="expand-more" href="javascript:;">
             <div>
               <img ui:field="mediaType" src=""/>
             </div>
@@ -48,6 +48,9 @@
               <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/widgets/MediaItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java
index 09febc23d..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
@@ -76,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";
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 bf0c0521b..e1fae223f 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
@@ -38,9 +38,6 @@ public interface ApplicationResources extends ClientBundle {
   @Source("avatar.png")
   ImageResource avatar();
 
-  @Source("sound.png")
-  ImageResource sound();
-
   @Source("offline.png")
   ImageResource offline();
 }
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 53069e6671ec0ea34fb1bbc652d824072e73ee0b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2057
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

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 0b09eb084f22485e902c922898819f8c3178520a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3106
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

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 c18a57fded2af873a5387de6f86d99a99a3d7c01..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2438
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
Eg0J|D`~Uy|

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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index dbfd7947d..5de11bc56 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
@@ -955,7 +955,10 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   background-color: #f6f6f6;
   width: 100%;
   color: black;
+}
 
+audio::-webkit-media-controls-enclosure {
+  border-radius: 0;;
 }
 
 .info-nb-sous-elmt {
@@ -1291,12 +1294,12 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #attachments li a.expand-more {
-	background: transparent url(icons/expand_more.svg) right 1em no-repeat;
+	background: transparent url(icons/expand_more.svg) right 0.5em no-repeat;
 	margin-right: 0.5em;
 }
 
 #attachments li a.expand-less {
-  background: transparent url(icons/expand_less.svg) right 1em no-repeat;
+  background: transparent url(icons/expand_less.svg) right 0.5em no-repeat;
   margin-right: 0.5em;
 }
 
@@ -1306,7 +1309,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 #attachments li a span {
   display: block;
-  padding-right:0.5em;
+  padding-right:1em;
 }
 
 .ops-open, .ops-open #share, .ops-open #download, .ops-open #view, .ops-open #notify {
@@ -1315,7 +1318,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   height: 30px;
   line-height:30px;
   transform: scaleY(1);
-  margin-bottom:10px;
+  margin-bottom:1em;
 }
 
 .ops-closed, .ops-closed #share, .ops-closed #download, .ops-closed #view, .ops-closed #notify {
@@ -1337,7 +1340,7 @@ li > #operations {
   width: 30px;
   height: 30px;
   border-radius: 0.25em;
-  margin-right: 1.5em;
+  margin-right: 1em;
   float : right;
 }
 
@@ -1348,7 +1351,7 @@ li > #operations {
   width: 30px;
   height: 30px;
   border-radius: 0.25em;
-  margin-right: 1.5em;
+  margin-right: 1em;
   float : right;
 }
 
@@ -1359,7 +1362,7 @@ li > #operations {
   width: 30px;
   height: 30px;
   border-radius: 0.25em;
-  margin-right: 1.5em;
+  margin-right: 1em;
   float : right;
 }
 
@@ -1370,7 +1373,7 @@ li > #operations {
   width: 30px;
   height: 30px;
   border-radius: 0.25em;
-  margin-right: 1.5em;
+  margin-right: 1em;
   float : right;
 }
 

From 10bc4093f54e657dff969e08693fbab3b6b2a6ae Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 23 Jan 2024 15:54:03 +0100
Subject: [PATCH 150/228] fix report

---
 .../pages/widgets/DeleteButton.java           | 23 ++++++++++---------
 1 file changed, 12 insertions(+), 11 deletions(-)

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/apps/notificationsbox/pages/widgets/DeleteButton.java
index 517ceea35..ee509d84c 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/apps/notificationsbox/pages/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.apps.notificationsbox.pages.widgets;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
@@ -31,13 +31,13 @@
 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.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.components.base.ActionItem;
 import org.silverpeas.mobile.client.components.base.ActionsMenu;
-import org.silverpeas.mobile.shared.dto.tickets.TicketDTO;
+import org.silverpeas.mobile.shared.dto.notifications.NotificationBoxDTO;
 
 import java.util.List;
 
@@ -50,7 +50,7 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
 
   private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class);
 
-  private SharesBoxPage parentPage;
+  private NotificationsBoxPage parentPage;
 
   @UiField
   HTMLPanel container;
@@ -58,19 +58,20 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
   Anchor delete;
 
   @UiField(provided = true)
-  protected ShareMessages msg = null;
+  protected NotificationsMessages msg = null;
 
 
   public DeleteButton() {
-    msg = GWT.create(ShareMessages.class);
+    msg = GWT.create(NotificationsMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
     setId("delete");
   }
 
   @UiHandler("delete")
   void delete(ClickEvent event) {
-    List<TicketDTO> selection = parentPage.getSelectedShares();
-    DeleteSharesEvent deleteEvent = new DeleteSharesEvent();
+    List<NotificationBoxDTO> selection = parentPage.getSelectedNotification();
+
+    DeleteNotificationsEvent deleteEvent = new DeleteNotificationsEvent();
     deleteEvent.setSelection(selection);
     if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent);
 
@@ -78,7 +79,7 @@ void delete(ClickEvent event) {
     ActionsMenu.close(getElement());
   }
 
-  public void setParentPage(final SharesBoxPage parentPage) {
+  public void setParentPage(final NotificationsBoxPage parentPage) {
     this.parentPage = parentPage;
   }
 }
\ No newline at end of file

From a069f655d97dd718e924875089ff5affd94754cb Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 23 Jan 2024 17:38:20 +0100
Subject: [PATCH 151/228] burger menu reorganisation

---
 .../components/base/NavigationMenu.ui.xml     |  5 ++++-
 .../org/silverpeas/mobile/public/spmobile.css | 21 ++++++++++++-------
 2 files changed, 18 insertions(+), 8 deletions(-)

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..dddcb14c0 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
@@ -41,10 +41,13 @@
       </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>
+      </ul>
+
+      <ul id="actions-menu">
+        <li id="menu-home"><g:Anchor ui:field="home" styleName="ui-link" text="{msg.home}"/></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>
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 5de11bc56..4cee66172 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
@@ -690,19 +690,19 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   height: 18px;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel {
+#silverpeas-navmenu-panel #navmenu-panel, #silverpeas-navmenu-panel #actions-menu {
   border-top: 1px solid #d3d3d3;
   list-style-type: none;
   padding: 0;
   margin: 0;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li {
+#silverpeas-navmenu-panel #navmenu-panel li, #silverpeas-navmenu-panel #actions-menu li {
   padding: 0;
   margin: 0;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li a {
+#silverpeas-navmenu-panel #navmenu-panel li a, #silverpeas-navmenu-panel #actions-menu li a {
   text-decoration: none;
   color: #333333;
   display: block;
@@ -712,6 +712,13 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   margin-left: 0.5em;
 }
 
+#actions-menu {
+  position: absolute;
+  bottom: 48px;
+  width: 100%;
+  border: 0;
+}
+
 #silverpeas-navmenu-panel #navmenu-panel li#menu-config a {
   background: transparent url('icons/settings.svg') no-repeat;
 }
@@ -720,7 +727,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   background: transparent url('icons/tasks.svg') no-repeat;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-help a {
+#silverpeas-navmenu-panel #actions-menu li#menu-help a {
   background: transparent url('icons/help.svg') no-repeat;
 }
 
@@ -732,16 +739,16 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   background: transparent url('icons/share.svg') no-repeat;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-parameter a {
+#silverpeas-navmenu-panel #actions-menu li#menu-parameter a {
   background: transparent url('icons/settings.svg') no-repeat;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-home a {
+#silverpeas-navmenu-panel #actions-menu li#menu-home a {
   background: transparent url('icons/home.svg') no-repeat;
 
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-logout a {
+#silverpeas-navmenu-panel #actions-menu li#menu-logout a {
   background: transparent url('icons/logout.svg') no-repeat;
 }
 

From 433d78ea6e373b47fd16f294fbef30d0e934ff81 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 24 Jan 2024 16:52:51 +0100
Subject: [PATCH 152/228] contacts render improvements

---
 .../contacts/pages/widgets/ContactItem.java   | 64 +++++++++----------
 .../resources/ApplicationResources.java       | 11 ++++
 .../mobile/client/resources/call.svg          |  1 +
 .../mobile/client/resources/sms.svg           |  1 +
 .../mobile/public/icons/account.svg           |  1 +
 .../mobile/public/icons/contacts.svg          |  1 +
 .../silverpeas/mobile/public/icons/search.svg |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 45 ++++++++-----
 8 files changed, 75 insertions(+), 50 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/call.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/sms.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/account.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/search.svg

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 f80da82c6..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,6 +38,7 @@
 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;
@@ -86,40 +89,23 @@ 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);
-        nbTel++;
+      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) {
@@ -131,18 +117,8 @@ public void setData(DetailUserDTO userData) {
       if (value != null & !value.isEmpty()) {
         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);
-
+          createPhoneFragment(field, value);
+          createSmsFragment(field, value);
           container.add(field);
         } else {
           HTML field = new HTML(value);
@@ -153,6 +129,24 @@ public void setData(DetailUserDTO userData) {
     }
   }
 
+  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/resources/ApplicationResources.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java
index e1fae223f..e96e5bbdd 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
@@ -40,4 +42,13 @@ public interface ApplicationResources extends ClientBundle {
 
   @Source("offline.png")
   ImageResource offline();
+
+  @Source("call.svg")
+  @DataResource.MimeType("image/svg+xml")
+  TextResource call();
+
+  @Source("sms.svg")
+  @DataResource.MimeType("image/svg+xml")
+  TextResource sms();
+
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/call.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/call.svg
new file mode 100644
index 000000000..08df7f11e
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/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/sms.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/sms.svg
new file mode 100644
index 000000000..c9f8ac0be
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/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/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/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/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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 4cee66172..e3455d904 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
@@ -256,8 +256,7 @@ 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;
@@ -1225,6 +1224,11 @@ audio::-webkit-media-controls-enclosure {
   text-decoration: underline;
 }
 
+#add-comment {
+  margin-left: 1em;
+  margin-right: 1em;
+}
+
 #add-comment,
 .introduction {
   position: relative;
@@ -1247,6 +1251,7 @@ audio::-webkit-media-controls-enclosure {
 #add-comment textarea.ui-input-text {
   font-size: 9pt;
   height: 7em;
+  border-radius: 10px;
 }
 
 #add-comment .btn-publicate {
@@ -1260,7 +1265,7 @@ audio::-webkit-media-controls-enclosure {
   position: absolute;
   right: 0;
   bottom: 5px;
-  margin-right: 1em ;
+  margin-right: 0.5em ;
 }
 
 #add-comment .btn-publicate.inactif {
@@ -1394,20 +1399,18 @@ li > #operations {
   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;
 }
@@ -1464,7 +1467,6 @@ li > #operations {
   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;
@@ -1494,7 +1496,7 @@ li > #operations {
   width: 98%;
   padding-right: 1%;
   padding-left: 1%;
-  line-height: 2em;
+  line-height: 2.5em;
   background-color: #FFF;
   font-size: 80%;
 }
@@ -1536,7 +1538,6 @@ input.filter-contacts {
   width: 24px;
   border: 1px solid #ccc;
   float: right;
-  /*margin-right: 1em;*/
 }
 
 .list-contacts .user-name,
@@ -1557,6 +1558,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***/
@@ -1782,11 +1796,12 @@ textarea.ui-input-text {
 }
 
 .searchButton {
-  width: 20px;
-  height: 17px;
-  background: transparent url(packPictos.png) bottom left no-repeat;
+  width: 24px;
+  height: 24px;
+  background: url('icons/search.svg') no-repeat;
   text-indent: -300em;
   display: inline-block;
+  position: absolute;
 }
 
 #menu-search {

From 44aaa2dfe41709626137236615e3e8f07424ab09 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 25 Jan 2024 10:28:14 +0100
Subject: [PATCH 153/228] Fix #13956

---
 .../org/silverpeas/mobile/server/services/ServiceDocuments.java  | 1 +
 1 file changed, 1 insertion(+)

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 3bab5eaf3..d6d837dd8 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
@@ -436,6 +436,7 @@ public PublicationDTO getPublication(@PathParam("id") String id,
       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 {

From d606c08093ca3bf3e5cf038c9cd987fbc8381271 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 25 Jan 2024 14:53:40 +0100
Subject: [PATCH 154/228] Fix content display for publications

---
 .../apps/documents/pages/PublicationPage.java | 11 --------
 .../common/PublicationContentHelper.java      | 28 ++++---------------
 2 files changed, 6 insertions(+), 33 deletions(-)

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 1b2232e1f..5cc6e8ff2 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
@@ -267,15 +267,4 @@ public static void showWebPageContent(String pubId, String appId, String 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/common/PublicationContentHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/PublicationContentHelper.java
index b06bf7803..3fa1d487a 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
@@ -78,28 +78,12 @@ 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;
     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());
-        }
-
-        @Override
-        public void onError(final Request request, final Throwable throwable) {
-          EventBus.getInstance().fireEvent(new ErrorEvent(throwable));
-        }
-      });
-
-    } catch (RequestException e) {
-      EventBus.getInstance().fireEvent(new ErrorEvent(e));
-    }
+    iframeC.setSrc(url);
+    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);
   }
 
   private static native void write(Document doc, String newHTML) /*-{

From c2d0cb79f1b9d5bd35789d8c87c99a74d4efcb82 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 25 Jan 2024 17:22:32 +0100
Subject: [PATCH 155/228] Improve render classified

---
 .../silverpeas/mobile/mobileSettings.properties   |  2 +-
 .../apps/classifieds/pages/ClassifiedsPage.ui.xml |  8 ++++----
 .../org/silverpeas/mobile/public/components.css   |  2 +-
 .../org/silverpeas/mobile/public/spmobile.css     | 15 ++++++++++++---
 4 files changed, 18 insertions(+), 9 deletions(-)

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 6d6bfebfc..5e6857bc0 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
@@ -98,7 +98,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
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 b7a27a9e1..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,13 +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">
-    <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/public/components.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
index 005698838..0f423a3e0 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
@@ -66,7 +66,7 @@
     display: block;
     width: 100%;
         box-shadow: 0 2px 10px 0 rgba(0,0,0,0.3);
-    border-radius: 2em;
+    border-radius: 1px;
     height: 4px;
     background: #fff;
     transition: all .3s;
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 e3455d904..a2c03e968 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
@@ -489,7 +489,6 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   overflow: hidden;
   padding: 0;
   position: absolute;
-  right: 94px;
   top: 1px;
   height: 44px;
 }
@@ -1535,7 +1534,7 @@ input.filter-contacts {
 .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;
 }
@@ -1731,7 +1730,7 @@ textarea.ui-input-text {
   background: #FFF url(bg-input-password.png) 0 0 no-repeat;
 }
 
-#page-login #DomainId {
+#page-login #DomainId, .filter-list {
   width: 70vw;
   box-sizing: border-box;
   padding: 0.5em;
@@ -2579,10 +2578,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 {

From 53391978484d0f74e7439b8ca4318aec32a51eec Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 25 Jan 2024 18:06:57 +0100
Subject: [PATCH 156/228] Fix some render

---
 .../mobile/client/apps/blog/pages/BlogPage.ui.xml           | 2 +-
 .../mobile/client/common/PublicationContentHelper.java      | 6 ++----
 2 files changed, 3 insertions(+), 5 deletions(-)

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 c49ab8996..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,7 +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">
-    <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/common/PublicationContentHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/PublicationContentHelper.java
index 3fa1d487a..8cf65daf2 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
@@ -79,10 +79,8 @@ public static void showContent(String pubId, String appId, Element basement) {
     final String url = UrlUtils.getServicesLocation() + "PublicationContent" + "?id=" + pubId + "&componentId=" + appId;
     IFrameElement iframeC = Document.get().createIFrameElement();
     iframeC.setSrc(url);
-    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));");
+    String s = "border-style: none; width: 100%; height:50vh; overflow: hidden;";
+    iframeC.setAttribute("style", s);
     basement.appendChild(iframeC);
   }
 

From 5002881e74b7ad5a7127eada880f3a11eb8bbd76 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 26 Jan 2024 12:50:21 +0100
Subject: [PATCH 157/228] change events render

---
 .../client/apps/agenda/pages/EventPage.ui.xml |  2 +-
 .../mobile/public/icons/calendar_today.svg    |  1 +
 .../mobile/public/icons/remove_circle.svg     |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 30 +++++++++++--------
 4 files changed, 20 insertions(+), 14 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar_today.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/remove_circle.svg

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 e81da70b1..e0251c6b9 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
@@ -35,7 +35,7 @@
     <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>
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/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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index a2c03e968..e0bf7cf14 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
@@ -383,9 +383,9 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 	display:block;
 	width:16px;
 	height:16px;
-	background-image: url(packImagesNavigation.png);
-	background-position:-28px -2174px;
+	background-image: url('icons/calendar_today.svg');
     background-repeat: no-repeat;
+  background-size: contain;
 	position:absolute;
 	top:0;
 	right:1.25em;
@@ -1167,9 +1167,9 @@ audio::-webkit-media-controls-enclosure {
 }
 
 #event #participation .label {
-  background: #fff url(packImagesNavigation.png) 0.15em -1870px no-repeat;
-  padding-left: 1.5625em;
-  line-height: 1.15em;
+  background: #fff url('icons/peoples.svg')  no-repeat;
+  padding-left: 2em;
+  line-height: 2em;
   padding-bottom: 0.5em;
   display: block;
 }
@@ -1207,15 +1207,16 @@ audio::-webkit-media-controls-enclosure {
 
 #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 {
@@ -2424,7 +2425,7 @@ a.popin-btn {
 }
 
 .ui-list-graduate > li {
-  background: #f4f4f4 url(packImagesNavigation.png) right -2104px no-repeat;
+  background: url('icons/expand_more.svg') right no-repeat;
   border-bottom: 1px solid #ddd;
   position: relative;
 }
@@ -2435,13 +2436,16 @@ 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 {

From 357085e6a8514b141ef4cd8d29fec174ab9df2d5 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 29 Jan 2024 16:58:24 +0100
Subject: [PATCH 158/228] change render group event

---
 .../mobile/client/apps/sharesbox/SharesBoxApp.java  | 12 +++++++++++-
 .../java/org/silverpeas/mobile/public/spmobile.css  | 13 ++++++-------
 2 files changed, 17 insertions(+), 8 deletions(-)

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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index e0bf7cf14..2dc8c3b81 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
@@ -2425,7 +2425,7 @@ a.popin-btn {
 }
 
 .ui-list-graduate > li {
-  background: url('icons/expand_more.svg') right no-repeat;
+  background: url('icons/expand_more.svg') top right no-repeat;
   border-bottom: 1px solid #ddd;
   position: relative;
 }
@@ -2449,7 +2449,7 @@ a.popin-btn {
 }
 
 .ui-list-graduate li.open .nb-event {
-  display: none;
+
 }
 
 .ui-list-graduate > li:nth-child(odd) {
@@ -2457,12 +2457,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 {
@@ -2470,8 +2470,7 @@ a.popin-btn {
 }
 
 .ui-list-graduate li.open ul {
-  background-color: #4c4c4c;
-  display: block;
+
 }
 
 #list-events .open .ui-listview {
@@ -2517,7 +2516,7 @@ a.popin-btn {
   margin-top: 0.5em;
   max-width: 80%;
   text-overflow: ellipsis;
-  height: 1em;
+  line-height: 1em;
   overflow: hidden;
   white-space: nowrap;
 }

From 4dd54d428e95b4166629f3e26c6c514fbc17b19c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 30 Jan 2024 11:21:12 +0100
Subject: [PATCH 159/228] enhance publication content display

---
 .../mobile/client/apps/documents/pages/PublicationPage.java    | 2 +-
 .../mobile/client/common/PublicationContentHelper.java         | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

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 5cc6e8ff2..9aa155e3e 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
@@ -124,7 +124,7 @@ interface PublicationPageUiBinder extends UiBinder<Widget, PublicationPage> {}
   public PublicationPage() {
     msg = GWT.create(DocumentsMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
-    supercontainer.getElement().setAttribute("style","height:100vh;");
+    supercontainer.getElement().setAttribute("style","min-height:100vh;");
     container.getElement().setId("publication");
     attachments.getElement().setId("attachments");
     linkedPublications.getElement().setId("linkedPublications");
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 8cf65daf2..045a64932 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
@@ -79,7 +79,8 @@ public static void showContent(String pubId, String appId, Element basement) {
     final String url = UrlUtils.getServicesLocation() + "PublicationContent" + "?id=" + pubId + "&componentId=" + appId;
     IFrameElement iframeC = Document.get().createIFrameElement();
     iframeC.setSrc(url);
-    String s = "border-style: none; width: 100%; height:50vh; overflow: hidden;";
+    iframeC.setAttribute("onload", "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';}(this));");
+    String s = "border-style: none; width: 100%; overflow: hidden;";
     iframeC.setAttribute("style", s);
     basement.appendChild(iframeC);
   }

From 69ea2dfd2c2ba03b900ee4b428b724921a91f256 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 30 Jan 2024 11:28:37 +0100
Subject: [PATCH 160/228] simplify ui

---
 .../mobile/client/apps/documents/pages/PublicationPage.java   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

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 9aa155e3e..6beb5f16f 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
@@ -175,8 +175,10 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
 
     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());
     }
-    contentLink.setVisible(publication.getContent());
     swipeRecognizer = new SwipeRecognizer(supercontainer);
   }
 

From 65ab6de676b98f4aade906127730232ca1c88e1c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 30 Jan 2024 12:57:26 +0100
Subject: [PATCH 161/228] Fix config refresh

---
 .../mobile/client/apps/config/pages/ConfigPage.java  |  4 +++-
 .../client/apps/config/pages/ConfigPage.ui.xml       |  5 +++++
 .../client/components/homepage/HomePageContent.java  |  4 ++++
 .../java/org/silverpeas/mobile/public/spmobile.css   | 12 ++++--------
 4 files changed, 16 insertions(+), 9 deletions(-)

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..80833e570 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
@@ -53,7 +53,7 @@ public class ConfigPage extends PageContent implements ConfigPagesEventHandler {
   @UiField
   CheckBox lastPublicationsDisplay, lastEventsDisplay;
   @UiField
-  CheckBox favoritesDisplay, shortCutsDisplay;
+  CheckBox favoritesDisplay, shortCutsDisplay, shortCutsToolsDisplay;
   private Config config;
   public ConfigPage() {
     initWidget(uiBinder.createAndBindUi(this));
@@ -84,6 +84,7 @@ public void onConfigLoaded(ConfigLoadedEvent event) {
     favoritesDisplay.setValue(config.isFavoritesDisplay());
     lastEventsDisplay.setValue(config.isLastEventsDisplay());
     shortCutsDisplay.setValue(config.isShortCutsDisplay());
+    shortCutsToolsDisplay.setValue(config.isShortCutsToolsDisplay());
   }
 
   private void save() {
@@ -92,6 +93,7 @@ private void save() {
     config.setLastPublicationsDisplay(lastPublicationsDisplay.getValue());
     config.setLastEventsDisplay(lastEventsDisplay.getValue());
     config.setShortCutsDisplay(shortCutsDisplay.getValue());
+    config.setShortCutsToolsDisplay(shortCutsToolsDisplay.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..91f03d3c5 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
@@ -55,6 +55,11 @@
           <g:CheckBox ui:field="shortCutsDisplay" text="Afficher les raccourcis"></g:CheckBox>
         </a>
       </li>
+      <li class="shortcutools">
+        <a class="ui-btn">
+          <g:CheckBox ui:field="shortCutsToolsDisplay" text="Afficher les outils"></g:CheckBox>
+        </a>
+      </li>
     </ul>
   </g:HTMLPanel>
   </g:HTMLPanel>
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..a53eaa78f 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) {
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 2dc8c3b81..5b69e08e8 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
@@ -2097,23 +2097,19 @@ form .forms .fields > li:nth-child(even) {
 }
 
 .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 {

From 460855c152643fff31f73733694921141bbacd54 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 31 Jan 2024 12:41:52 +0100
Subject: [PATCH 162/228] Fix media upload

---
 .../mobile/client/apps/media/pages/MediaNavigationPage.java      | 1 +
 1 file changed, 1 insertion(+)

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 e11c7defd..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
@@ -87,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));
   }
 

From df541f92afac820e3f2ca13a783f85924517f6c1 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 1 Feb 2024 17:48:03 +0100
Subject: [PATCH 163/228] Fix favorites

---
 .../mobile/client/apps/documents/DocumentsApp.java    |  5 -----
 .../mobile/client/apps/favorites/FavoritesApp.java    |  8 +++++---
 .../favorites/pages/widgets/AddToFavoritesButton.java |  3 +++
 .../apps/favorites/resources/FavoritesMessages.java   |  1 +
 .../favorites/resources/FavoritesMessages.properties  |  1 +
 .../resources/FavoritesMessages_en.properties         |  1 +
 .../resources/FavoritesMessages_fr.properties         |  1 +
 .../mobile/client/apps/navigation/NavigationApp.java  | 11 +++++++----
 8 files changed, 19 insertions(+), 12 deletions(-)

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 5ad48dff1..2c5fc930d 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
@@ -51,7 +51,6 @@
 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.resources.ApplicationMessages;
 import org.silverpeas.mobile.shared.dto.BaseDTO;
@@ -212,16 +211,12 @@ public void execute() {
         event.getContent().getType().equals(ContentsTypes.News.name()) ||
         event.getContent().getType().equals(ContentsTypes.Attachment.name()) ||
         event.getContent().getType().equals(ContentsTypes.Folder.name())) {
-      if (event.getContent().getInstanceId().startsWith("kmelia") ||
-              event.getContent().getInstanceId().startsWith("quickinfo") ||
-              event.getContent().getInstanceId().startsWith("blog")) {
         loadAppInstance(event.getContent(), new Command() {
           @Override
           public void execute() {
             startWithContent(event.getContent());
           }
         });
-      }
     }
   }
 
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..bfc2bc8e5 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,7 +25,6 @@
 package org.silverpeas.mobile.client.apps.favorites;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.rpc.AsyncCallback;
 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;
@@ -39,7 +38,6 @@
 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;
@@ -102,7 +100,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());
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 385a1ec29..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,6 +34,7 @@
 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;
 
@@ -77,6 +78,8 @@ void displayNotificationPage(ClickEvent event){
 
         // hide menu
         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/resources/FavoritesMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.java
index 6ae2fe4a6..994ee4daa 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,6 @@
 
 public interface FavoritesMessages extends Messages {
   String addToFavoritesContent();
+  String favoriteAdded();
 
 }
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..b8480eb24 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,4 @@
 #
 
 addToFavoritesContent=Ajouter en favoris
+favoriteAdded=Favoris ajouté !
\ 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..27dc8e7b3 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,4 @@
 #
 
 addToFavoritesContent=Add to favorites
+favoriteAdded=Favorite added !
\ 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..b8480eb24 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,4 @@
 #
 
 addToFavoritesContent=Ajouter en favoris
+favoriteAdded=Favoris ajouté !
\ No newline at end of file
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 e8878068d..2c57117d6 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
@@ -25,7 +25,6 @@
 package org.silverpeas.mobile.client.apps.navigation;
 
 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.SpMobil;
 import org.silverpeas.mobile.client.apps.navigation.events.app.AbstractNavigationAppEvent;
@@ -106,11 +105,15 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) {
   @Override
   public void showContent(final NavigationShowContentEvent event) {
       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() {
-                  String id = event.getContent().getInstanceId();
-                  if (id == null || id.isEmpty()) id = event.getContent().getId();
                   ServicesLocator.getServiceNavigation().getSpace(id, this);
               }
               @Override
@@ -119,7 +122,7 @@ public void onSuccess(Method method, SpaceDTO space) {
                       ShortCutRouter.route(SpMobil.getUser(), space.getHomePageParameter(), "Component", null, null, null);
                   } else {
                       NavigationPage page = new NavigationPage();
-                      page.setRootSpaceId(event.getContent().getInstanceId());
+                      page.setRootSpaceId(id);
                       page.show();
                   }
               }

From 62f8bb75a83ec89435eab1663b1635136f07bee1 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 2 Feb 2024 11:58:06 +0100
Subject: [PATCH 164/228] embbeding apps icons

---
 .../apps/documents/pages/widgets/GedItem.java |   9 +-
 .../documents/pages/widgets/GedItem.ui.xml    |   3 +-
 .../apps/media/pages/widgets/AlbumItem.java   |   5 +
 .../apps/media/pages/widgets/AlbumItem.ui.xml |   1 +
 .../pages/widgets/NavigationItem.java         |  24 ++++-
 .../pages/widgets/NavigationItem.ui.xml       |   3 +-
 .../pages/NotificationSenderPage.java         |   9 +-
 .../pages/NotificationSenderPage.ui.xml       |   1 +
 .../resources/ApplicationResources.java       |  82 +++++++++++++++-
 .../resources}/icons/apps/blog.svg            |   0
 .../resources}/icons/apps/book_online.svg     |   0
 .../resources}/icons/apps/calendar.svg        |   2 +-
 .../resources}/icons/apps/classifieds.svg     |   0
 .../resources}/icons/apps/faq.svg             |   0
 .../resources}/icons/apps/form.svg            |   0
 .../client/resources/icons/apps/ged.svg       |   1 +
 .../resources/icons/apps/ged}/folder.svg      |   2 +-
 .../resources/icons/apps/ged}/publication.svg |   0
 .../resources/icons/apps/ged}/trash.svg       |   0
 .../resources}/icons/apps/link.svg            |   0
 .../resources}/icons/apps/media_library.svg   |   0
 .../resources}/icons/apps/news.svg            |   2 +-
 .../resources}/icons/apps/poll.svg            |   0
 .../resources}/icons/apps/quiz.svg            |   0
 .../resources}/icons/apps/webpage.svg         |   0
 .../resources}/icons/apps/workflow.svg        |   0
 .../client/resources/{ => icons}/avatar.png   | Bin
 .../client/resources/{ => icons}/call.svg     |   0
 .../client/resources/{ => icons}/offline.png  | Bin
 .../client/resources/{ => icons}/sms.svg      |   0
 .../org/silverpeas/mobile/public/spmobile.css |  91 +++++++-----------
 31 files changed, 159 insertions(+), 76 deletions(-)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/blog.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/book_online.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/calendar.svg (96%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/classifieds.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/faq.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/form.svg (100%)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged.svg
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public/icons/apps => client/resources/icons/apps/ged}/folder.svg (73%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public/icons => client/resources/icons/apps/ged}/publication.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public/icons => client/resources/icons/apps/ged}/trash.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/link.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/media_library.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/news.svg (95%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/poll.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/quiz.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/webpage.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/apps/workflow.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/resources/{ => icons}/avatar.png (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/resources/{ => icons}/call.svg (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/resources/{ => icons}/offline.png (100%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/resources/{ => icons}/sms.svg (100%)

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 13375de45..f66332b33 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> {
   }
@@ -62,14 +65,18 @@ public void setData(Object data) {
       dataTopic = (TopicDTO) data;
       if (dataTopic.getId().equals("1")) {
         setStyleName("trash");
+        icon.setHTML(resources.trash().getText());
+        link.setText(dataTopic.getName());
       } else {
         setStyleName("folder-ged");
+        icon.setHTML(resources.folder().getText());
       }
       link.setText(dataTopic.getName() + " (" + dataTopic.getPubCount() + ")");
     } 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;";
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/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/navigation/pages/widgets/NavigationItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.java
index 5a7f7b79c..2f20ad283 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> {
   }
@@ -66,33 +70,47 @@ public void setData(SilverpeasObjectDTO data) {
     } 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-btn-icon-right ui-icon-carat-r");
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/notifications/pages/NotificationSenderPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notifications/pages/NotificationSenderPage.java
index f82df83de..8d9f78d20 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,14 @@ 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 TextArea message;
     @UiField TextBox subject;
+    @UiField InlineHTML iconFile;
 
     List<BaseDTO> selection = new ArrayList<BaseDTO>();
 
@@ -78,6 +78,7 @@ 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
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 24e686ad5..3835c6ded 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,6 +33,7 @@
 
         <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>
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 e96e5bbdd..7a043088f 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
@@ -37,18 +37,92 @@ public interface ApplicationResources extends ClientBundle {
   @Source("application.css")
   ApplicationCSS css();
 
-  @Source("avatar.png")
+  @Source("icons/avatar.png")
   ImageResource avatar();
 
-  @Source("offline.png")
+  @Source("icons/offline.png")
   ImageResource offline();
 
-  @Source("call.svg")
+  @Source("icons/call.svg")
   @DataResource.MimeType("image/svg+xml")
   TextResource call();
 
-  @Source("sms.svg")
+  @Source("icons/sms.svg")
   @DataResource.MimeType("image/svg+xml")
   TextResource sms();
 
+
+  /** 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();
+
 }
+
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/blog.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/blog.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/blog.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/blog.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/book_online.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/book_online.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/book_online.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/book_online.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/calendar.svg
similarity index 96%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/calendar.svg
index bdce5c812..d628db86d 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/calendar.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/calendar.svg
@@ -1 +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" fill="#7eb73b"/></svg>
\ No newline at end of file
+<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/public/icons/apps/classifieds.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/classifieds.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/classifieds.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/classifieds.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/faq.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/faq.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/faq.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/faq.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/form.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/form.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/form.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/form.svg
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/public/icons/apps/folder.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/folder.svg
similarity index 73%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/folder.svg
index 5017b4816..72a671828 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/folder.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/folder.svg
@@ -1 +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" fill="#7eb73b"/></svg>
\ No newline at end of file
+<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/public/icons/publication.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/publication.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/publication.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/publication.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/trash.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/trash.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/trash.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/ged/trash.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/link.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/link.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/link.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/link.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/media_library.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/media_library.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/media_library.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/media_library.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/news.svg
similarity index 95%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/news.svg
index 550afbdd9..e6ecbc14e 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/news.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/news.svg
@@ -1 +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" fill="#7eb73b"/></svg>
\ No newline at end of file
+<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/public/icons/apps/poll.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/poll.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/poll.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/poll.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/quiz.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/quiz.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/quiz.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/quiz.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/webpage.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/webpage.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/webpage.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/webpage.svg
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/workflow.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/workflow.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/apps/workflow.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/apps/workflow.svg
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/call.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/call.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/client/resources/call.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/call.svg
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/sms.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/sms.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/client/resources/sms.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/sms.svg
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 5b69e08e8..e55b7aff5 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
@@ -782,12 +782,16 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 /***** NAVIGATION ****/
 
-.folder-ged a, .folder-galery a, .publication a, .media a, .trash a, .app-actuality a,
+.icon-app, .icon-item {
+  position: absolute;
+  top: 0.5em;
+  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.5em
+  padding-left: 2.5em;
 }
 
 #actionsList:has(.add-task) {
@@ -812,99 +816,71 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 .app-formsOnline a {
-  background: transparent url('icons/apps/form.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-almanach a {
-  background: transparent url('icons/apps/calendar.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-link a {
-  background: transparent url('icons/apps/link.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-actuality a {
-  background: transparent url('icons/apps/news.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .folder-ged a {
-  background: transparent url('icons/apps/folder.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
+}
+
+.app-ged a {
+
 }
 
 .app-pageWeb a {
-  background: transparent url('icons/apps/webpage.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-blog a {
-  background: transparent url('icons/apps/blog.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-classifieds a {
-  background: transparent url('icons/apps/classifieds.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-survey a {
-  background: transparent url('icons/apps/quiz.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-polling a {
-  background: transparent url('icons/apps/poll.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-faq a {
-  background: transparent url('icons/apps/faq.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-workflow a {
-  background: transparent url('icons/apps/workflow.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .app-resourcesManager a {
-  background: transparent url('icons/apps/book_online.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .folder-galery a {
-  background: transparent url('icons/apps/media_library.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .publication a {
-  background: transparent url('icons/publication.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .trash a {
-  background: transparent url('icons/trash.svg') no-repeat;
-  background-position-y: center;
-  background-position-x: 0.5em;
+
 }
 
 .media a {
@@ -1491,6 +1467,10 @@ li > #operations {
   margin-bottom: 0;
 }
 
+#edit-notification .iconFile {
+  position: absolute;
+}
+
 .filter-contacts,
 #edit-notification .ui-input-text.publication {
   width: 98%;
@@ -1501,10 +1481,6 @@ li > #operations {
   font-size: 80%;
 }
 
-#edit-notification .ui-input-text.publication {
-  background: url('icons/publication.svg') no-repeat #ffff;
-}
-
 .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 {
   float: none;
   clear: inherit;
@@ -2119,6 +2095,7 @@ form .forms .fields > li:nth-child(even) {
 .ui-listview.favoris a {
   background: transparent url('icons/star.svg') no-repeat;
   background-size: auto;
+  background-position-y: center;
   padding-left: 2em;
 }
 

From 4f214a2780a6832bae0c474a82ca47cbfe348c00 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 2 Feb 2024 16:12:43 +0100
Subject: [PATCH 165/228] manage file permalink

---
 .../main/java/org/silverpeas/bridge/MobilFilter.java   |  5 ++++-
 .../java/org/silverpeas/mobile/client/SpMobil.java     |  7 ++++---
 .../mobile/client/apps/documents/DocumentsApp.java     |  4 +++-
 .../client/apps/documents/pages/PublicationPage.java   |  1 -
 .../mobile/client/common/navigation/LinksManager.java  | 10 +++++++++-
 .../client/components/attachments/Attachment.java      |  3 +--
 .../components/attachments/AttachmentsManager.java     |  7 +++++++
 7 files changed, 28 insertions(+), 9 deletions(-)

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 ca5f85722..a982ae4bb 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -97,7 +97,6 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
       final boolean isMobile = Boolean.TRUE.equals(mobileAlreadyDetected)
                                || userAgent.contains("Android")
                                || userAgent.contains("iPhone");
-
       session.setAttribute("isMobile", isMobile);
 
       final boolean tablet = session.getAttribute("tablet", Boolean.class, false);
@@ -119,6 +118,10 @@ 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);
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 2004d5b70..97d032de4 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
@@ -283,10 +283,11 @@ public static void displayMainPage() {
     PageHistory.getInstance().clear();
     PageHistory.getInstance().goTo(new HomePage());
 
-    if ((shortcutAppId != null && shortcutContentType != null && shortcutContentId != null) ||
+    if ((shortcutContentType != null && shortcutContentId != null) ||
+            (shortcutAppId != null && shortcutContentType != null && shortcutContentId != null) ||
             shortcutContributionId != null ||
-            (shortcutContentType != null && (shortcutContentType.equals("Component") || shortcutContentType.equals("Space")) &&
-                    shortcutAppId != 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) {
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 2c5fc930d..014072ce2 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
@@ -52,6 +52,7 @@
 import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly;
 import org.silverpeas.mobile.client.components.IframePage;
 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;
@@ -209,7 +210,6 @@ 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
@@ -217,6 +217,8 @@ public void execute() {
             startWithContent(event.getContent());
           }
         });
+    } else if (event.getContent().getType().equals(ContentsTypes.Attachment.name())) {
+      AttachmentsManager.viewDocument(event.getContent().getId(), event.getContent().getRole());
     }
   }
 
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 6beb5f16f..f41157f3d 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
@@ -34,7 +34,6 @@
 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.*;
 import org.silverpeas.mobile.client.apps.comments.pages.widgets.CommentsButton;
 import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadAttachmentsEvent;
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 5da0be052..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
@@ -67,10 +67,18 @@ 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/")) {
@@ -117,7 +125,7 @@ public static void processLink(HyperLinkDTO hyperLinkDTO) {
       }
 
       ShortCutRouter
-              .route(SpMobil.getUser(), shortcutAppId, shortcutContentType, shortcutContentId, null, null);
+              .route(SpMobil.getUser(), shortcutAppId, shortcutContentType, shortcutContentId, null, shortcutContentRole);
       return;
     }
     openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink());
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 57de0f37e..f230e889e 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
@@ -188,8 +188,7 @@ private void toogleOperations() {
   }
 
   private void viewDocument() {
-    IframePage page = new IframePage("/silverpeas/services/media/viewer/embed/pdf?documentId="+data.getId()+"&documentType=attachment&language="+data.getLang()+"&embedPlayer=true");
-    page.show();
+    AttachmentsManager.viewDocument(data.getId(), data.getLang());
   }
 
   @UiHandler("share")
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();

From 923ce0dc68e7da86c324e6fe0a9e84ecf36600ab Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 2 Feb 2024 16:28:45 +0100
Subject: [PATCH 166/228] render share improve

---
 .../mobile/client/apps/documents/pages/SharingPage.ui.xml     | 4 ++--
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css   | 4 ++++
 2 files changed, 6 insertions(+), 2 deletions(-)

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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index e55b7aff5..8c1aaecb4 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
@@ -1717,6 +1717,10 @@ textarea.ui-input-text {
   box-shadow: 0 0 1em 0 rgba(0, 0, 0, 0.2);
 }
 
+.field-label {
+  padding-right: 1em;
+}
+
 #page-login #password-visibility {
   margin-bottom: 1.5em;
 }

From e1a23c73c133d960b11593776640baa30b60cba7 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 2 Feb 2024 18:29:19 +0100
Subject: [PATCH 167/228] enhance notifications ui

---
 .../client/apps/agenda/pages/EventPage.java     | 10 ++++++----
 .../client/apps/agenda/pages/EventPage.ui.xml   |  4 +++-
 .../apps/agenda/resources/AgendaMessages.java   |  2 ++
 .../agenda/resources/AgendaMessages.properties  |  2 +-
 .../resources/AgendaMessages_en.properties      |  1 +
 .../resources/AgendaMessages_fr.properties      |  1 +
 .../pages/NotificationSenderPage.java           | 16 ++++++----------
 .../pages/NotificationSenderPage.ui.xml         |  6 ++----
 .../client/components/base/ActionsMenu.java     |  6 ++++--
 .../userselection/widgets/UserGroupItem.java    |  6 +++++-
 .../client/resources/ApplicationResources.java  |  4 ++++
 .../resources}/icons/peoples.svg                |  0
 .../org/silverpeas/mobile/public/spmobile.css   | 17 +++++++++++------
 .../server/services/ServiceNotifications.java   |  9 +++------
 .../server/services/helpers/UserHelper.java     |  4 +++-
 .../silverpeas/mobile/shared/dto/GroupDTO.java  |  7 +++++++
 16 files changed, 59 insertions(+), 36 deletions(-)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/peoples.svg (100%)

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 dae0f0602..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;
@@ -70,6 +67,7 @@
 import org.silverpeas.mobile.client.components.UnorderedList;
 import org.silverpeas.mobile.client.components.attachments.Attachment;
 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;
@@ -89,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;
 
@@ -113,6 +112,8 @@ public class EventPage  extends PageContent implements EventPagesEventHandler {
   @UiField
   UnorderedList attachments, attendees;
 
+  @UiField
+  InlineHTML iconParticipants;
   private CalendarEventDTO event;
   private CalendarDTO calendar;
   private ReminderDTO reminderDTO;
@@ -140,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);
   }
 
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 e0251c6b9..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
@@ -58,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/resources/AgendaMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.java
index 4df42e804..d4eccf8d5 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();
 
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..b50db1a4f 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
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..038d1d63f 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
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..b50db1a4f 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
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 8d9f78d20..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
@@ -63,10 +63,11 @@ interface NotificationSenderPageUiBinder extends UiBinder<HTMLPanel, Notificatio
 
     @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;
+    @UiField InlineHTML iconFile, iconSelection;
+    @UiField HTML destinataires;
 
     List<BaseDTO> selection = new ArrayList<BaseDTO>();
 
@@ -84,7 +85,7 @@ public NotificationSenderPage() {
              @Override
              public void execute() {
 
-                 Element destinataires = Document.get().getElementById("destinataires");
+                 //Element destinataires = Document.get().getElementById("destinataires");
 
 
                  String dest = "";
@@ -98,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());
              }
          }
@@ -110,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 3835c6ded..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
@@ -38,9 +38,8 @@
         </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">
@@ -49,7 +48,6 @@
         </div>
         <div class=" ui-controlgroup ui-controlgroup-horizontal" >
             <div class="ui-controlgroup-controls ">
-
                 <g:Anchor ui:field="send" styleName="btn-validate ui-link">
                     <span class="ui-btn-text"><ui:safehtml from="{msg.send}"/></span>
                 </g:Anchor>
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 11bac95d2..91aed772c 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
@@ -75,8 +75,10 @@ protected void showActions(ClickEvent event) {
     }
 
     public static void close(Element action) {
-        action.getParentElement().removeClassName("open-qvf-menu");
-        action.getParentElement().addClassName("closed-qvf-menu");
+        if (action.getParentElement() != null) {
+            action.getParentElement().removeClassName("open-qvf-menu");
+            action.getParentElement().addClassName("closed-qvf-menu");
+        }
     }
 
     public void close() {
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/resources/ApplicationResources.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java
index 7a043088f..d8b1fe97f 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
@@ -51,6 +51,10 @@ public interface ApplicationResources extends ClientBundle {
   @DataResource.MimeType("image/svg+xml")
   TextResource sms();
 
+  @Source("icons/peoples.svg")
+  @DataResource.MimeType("image/svg+xml")
+  TextResource peoples();
+
 
   /** Applications icons **/
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/peoples.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/peoples.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/peoples.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/peoples.svg
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 8c1aaecb4..9f13057ca 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
@@ -1142,12 +1142,14 @@ audio::-webkit-media-controls-enclosure {
   line-height: 1.25em;
 }
 
+.icon-participation {
+  position: absolute;
+}
+
 #event #participation .label {
-  background: #fff url('icons/peoples.svg')  no-repeat;
-  padding-left: 2em;
   line-height: 2em;
   padding-bottom: 0.5em;
-  display: block;
+  padding-left: 2em;
 }
 
 #event #participation ul {
@@ -1417,8 +1419,6 @@ li > #operations {
 }
 
 #edit-notification .ui-input-text.destinataires {
-  background: #FFF url('icons/peoples.svg') no-repeat;
-  padding-left: 4em;
   line-height: 1.4em;
   position: relative;
   color: #000;
@@ -1432,7 +1432,7 @@ li > #operations {
 
 #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;
@@ -1516,6 +1516,11 @@ input.filter-contacts {
   float: right;
 }
 
+.icon-group svg {
+  float: right;
+  width: 32px;
+}
+
 .list-contacts .user-name,
 .list-comments .user-name,
 .list-notifications .user-name {
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 83347a6f7..30e8ee7b1 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;
@@ -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);
             }
           }
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 a0e2d6b6b..84effe6f7 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;
@@ -104,10 +105,11 @@ public UserDTO populateUserDTO(UserDetail user) {
     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/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;
   }

From 114e4097264e548cf832ed0a41ca27b38c0f025c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 5 Feb 2024 17:52:26 +0100
Subject: [PATCH 168/228] Feature #13977

---
 .../org/silverpeas/mobile/client/SpMobil.java | 20 +++++++++++++
 .../apps/navigation/pages/NavigationPage.java |  1 +
 .../components/base/NavigationMenu.java       | 27 ++++++++++++++++++
 .../components/base/NavigationMenu.ui.xml     |  6 +++-
 .../mobile/client/components/base/Page.java   | 12 ++++++++
 .../mobile/client/pages/main/HomePage.java    |  1 +
 .../client/resources/ApplicationMessages.java |  5 +++-
 .../ApplicationMessages_en.properties         |  1 +
 .../ApplicationMessages_fr.properties         |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 18 ++++++++++++
 .../server/services/ServiceNavigation.java    | 28 ++++++++++++++++++-
 .../services/rest/ServiceNavigation.java      |  5 ++++
 12 files changed, 122 insertions(+), 3 deletions(-)

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 97d032de4..918205ae8 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
@@ -97,6 +97,8 @@
 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.navigation.SpaceDTO;
 import org.silverpeas.mobile.shared.dto.search.ResultDTO;
 import org.silverpeas.mobile.shared.exceptions.AuthenticationException;
 
@@ -138,6 +140,7 @@ public static UserProfileDTO getUserProfile() {
 
   public static void setUser(final DetailUserDTO user) {
     SpMobil.user = user;
+    displayPersonnalApps();
   }
 
 
@@ -316,6 +319,23 @@ 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());
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 95275f6be..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
@@ -106,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/components/base/NavigationMenu.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java
index fca5b1943..11d5affaa 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
@@ -47,6 +47,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;
@@ -54,6 +55,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;
@@ -70,6 +72,8 @@
 import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO;
 import org.silverpeas.mobile.shared.dto.navigation.Apps;
 
+import java.util.List;
+
 public class NavigationMenu extends Composite implements PageEventHandler {
 
   private static NavigationMenuUiBinder uiBinder = GWT.create(NavigationMenuUiBinder.class);
@@ -82,8 +86,16 @@ public class NavigationMenu extends Composite implements PageEventHandler {
 
   @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> {
   }
 
@@ -91,6 +103,7 @@ public NavigationMenu() {
     msg = GWT.create(ApplicationMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
     container.getElement().setId("silverpeas-navmenu-panel");
+    listApplications.getElement().setId("personals-apps");
     container.getElement().getStyle().setHeight(Window.getClientHeight(), Unit.PX);
     user.getElement().setId("user");
     String url = ResourcesManager.getParam("help.url");
@@ -106,6 +119,20 @@ public NavigationMenu() {
     EventBus.getInstance().addHandler(AbstractPageEvent.TYPE, this);
   }
 
+  public void setPersonalApps(List<ApplicationInstanceDTO> applicationInstanceDTOS) {
+    listApplications.clear();
+    for (ApplicationInstanceDTO app : applicationInstanceDTOS) {
+
+      if (app.getType().equals(Apps.kmelia.name())) {
+        app.setLabel(msg.myDocuments());
+      }
+      NavigationItem item = new NavigationItem();
+      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())) {
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 dddcb14c0..3c35704ba 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'/>
 
@@ -46,6 +48,8 @@
         <li id="menu-sharesbox"><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"><g:Anchor ui:field="home" styleName="ui-link" text="{msg.home}"/></li>
         <li id="menu-parameter"><g:Anchor ui:field="config" styleName="ui-link" text="{msg.config}"/></li>
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 350866f50..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
@@ -42,10 +42,14 @@
 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 {
 
   private static PageUiBinder uiBinder = GWT.create(PageUiBinder.class);
+
   interface PageUiBinder extends UiBinder<Widget, Page> {
   }
 
@@ -151,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/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 04109afb8..362e7e880 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
@@ -99,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")
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 db07d07f6..924bf0a65 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
@@ -45,6 +45,7 @@ tasks=My tasks
 disconnect=Log out
 
 personalSpace=Personal space
+myDocuments=My documents
 
 editStatus=Edit my status
 
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 b69627d60..5671729fb 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
@@ -48,6 +48,7 @@ tasks=Mes tâches
 
 disconnect=Déconnexion
 personalSpace=Espace personnel
+myDocuments=Mes documents
 
 editStatus=Modifier mon statut
 results=Contenus trouvés
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 9f13057ca..d20e4590d 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
@@ -717,6 +717,24 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   border: 0;
 }
 
+#personals-apps {
+  padding: inherit;
+  border-top: 1px solid #d3d3d3;
+}
+
+#personals-apps .icon-app {
+  top: auto;
+}
+#personals-apps a {
+  border: none;
+  padding-left: 2em;
+  padding-top: 0.5em;
+}
+
+#personals-apps a:after {
+  background: none;
+}
+
 #silverpeas-navmenu-panel #navmenu-panel li#menu-config a {
   background: transparent url('icons/settings.svg') no-repeat;
 }
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 6c010a204..849fa2fff 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
@@ -175,6 +175,7 @@ private DetailUserDTO initSession(DetailUserDTO user) {
       return null;
     }
   }
+
   protected void setUserInSession(UserDetail user) {
     request.getSession().setAttribute(AbstractAuthenticateService.USER_ATTRIBUT_NAME, user);
   }
@@ -237,7 +238,7 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
         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());
@@ -464,6 +465,23 @@ 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()) {
+        apps.add(populate(app));
+      }
+      return apps;
+    } catch (AdminException e) {
+      SilverLogger.getLogger(this).error(e);
+      throw new WebApplicationException(e);
+    }
+  }
+
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @Path("space/{spaceId}/")
@@ -627,6 +645,14 @@ private SpaceDTO populate(SpaceInst space) {
 
     return dto;
   }
+  private ApplicationInstanceDTO populate(ComponentInst app) {
+    ApplicationInstanceDTO dto = new ApplicationInstanceDTO();
+    dto.setId(app.getId());
+    dto.setLabel(app.getLabel());
+    dto.setType(app.getName());
+    dto.setOrderNum(app.getOrderNum());
+    return dto;
+  }
 
   private ApplicationInstanceDTO populate(ComponentInstLight app) {
     ApplicationInstanceDTO dto = new ApplicationInstanceDTO();
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 b95b56d41..81e1292d3 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
@@ -54,6 +54,11 @@ public interface ServiceNavigation extends RestService {
   @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}/")

From 9353033a57072a4804fda0ed6e297823175b7934 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 6 Feb 2024 18:33:06 +0100
Subject: [PATCH 169/228] Feature #13940

---
 .../client/apps/documents/DocumentsApp.java   |   5 +-
 .../app/DocumentsLoadGedItemsEvent.java       |  11 ++
 .../pages/navigation/GedItemsLoadedEvent.java |  10 ++
 .../documents/pages/GedNavigationPage.java    |  21 ++-
 .../pages/widgets/AddFileButton.java          | 141 +++++++++++++++
 .../pages/widgets/AddFileButton.ui.xml        |  34 ++++
 .../resources/DocumentsMessages.java          |   5 +
 .../resources/DocumentsMessages.properties    |   4 +
 .../resources/DocumentsMessages_en.properties |   6 +-
 .../resources/DocumentsMessages_fr.properties |   4 +
 .../components/attachments/Attachment.java    |  14 ++
 .../org/silverpeas/mobile/public/spmobile.css |   4 +-
 .../mobile/server/servlets/FileServlet.java   | 166 ++++++++++++++++++
 mobile-war/src/main/webapp/WEB-INF/web.xml    |  10 ++
 14 files changed, 430 insertions(+), 5 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.ui.xml
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/FileServlet.java

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 014072ce2..7c55fb18b 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
@@ -193,6 +193,9 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) {
       GedNavigationPage page = new GedNavigationPage();
       page.setPageTitle(event.getInstance().getLabel());
       page.setInstanceId(event.getInstance().getId());
+      //TODO : if writer manage validation
+      page.setCanImport(getApplicationInstance().getRights().getManager() ||
+              getApplicationInstance().getRights().getPublisher());
       page.setTopicId(null);
       page.show();
     }
@@ -239,7 +242,7 @@ 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(), event.isForceReload()));
       }
     };
     action.attempt();
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/pages/navigation/GedItemsLoadedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemsLoadedEvent.java
index 4e0001af7..1d0bb04bd 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,6 +31,7 @@
 public class GedItemsLoadedEvent extends AbstractGedNavigationPagesEvent {
 
 	private List<BaseDTO> topicsAndPublications;
+	private boolean forceReload = false;
 
 	private int sharing;
 	
@@ -40,6 +41,13 @@ public GedItemsLoadedEvent(List<BaseDTO> topicsAndPublications, int sharing) {
 		this.sharing = sharing;
 	}
 
+	public GedItemsLoadedEvent(List<BaseDTO> topicsAndPublications, int sharing, boolean forceReload) {
+		super();
+		this.topicsAndPublications = topicsAndPublications;
+		this.sharing = sharing;
+		this.forceReload = forceReload;
+	}
+
 	@Override
 	protected void dispatch(GedNavigationPagesEventHandler handler) {
 		handler.onLoadedTopics(this);
@@ -52,4 +60,6 @@ public List<BaseDTO> getTopicsAndPublications() {
 	public int getSharing() {
 		return sharing;
 	}
+
+	public boolean isForceReload() { return forceReload; }
 }
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 216394723..5acbb0a1b 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,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.Widget;
 import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadGedItemsEvent;
 import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadPublicationEvent;
@@ -36,10 +37,12 @@
 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.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;
 import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton;
+import org.silverpeas.mobile.client.apps.media.pages.widgets.AddMediaButton;
 import org.silverpeas.mobile.client.common.EventBus;
 import org.silverpeas.mobile.client.common.Notification;
 import org.silverpeas.mobile.client.common.app.View;
@@ -63,8 +66,12 @@ public class GedNavigationPage extends PageContent implements View, GedNavigatio
   private String rootTopicId, instanceId;
   private boolean dataLoaded = false;
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
+
+  private AddFileButton buttonImport = new AddFileButton();
   private ShareButton share = new ShareButton();
 
+  private boolean canImport = false;
+
   private static GedNavigationPageUiBinder uiBinder = GWT.create(GedNavigationPageUiBinder.class);
 
   interface GedNavigationPageUiBinder extends UiBinder<Widget, GedNavigationPage> {
@@ -73,6 +80,7 @@ interface GedNavigationPageUiBinder extends UiBinder<Widget, GedNavigationPage>
   public GedNavigationPage() {
     msg = GWT.create(DocumentsMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
+    buttonImport.setId("import");
     EventBus.getInstance().addHandler(AbstractGedNavigationPagesEvent.TYPE, this);
   }
 
@@ -88,13 +96,17 @@ public void setTopicId(String rootTopicId) {
     EventBus.getInstance().fireEvent(new DocumentsLoadGedItemsEvent(instanceId, rootTopicId));
   }
 
+  public 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())) {
       Notification.activityStart();
       list.clear();
       List<BaseDTO> dataItems = event.getTopicsAndPublications();
@@ -114,8 +126,14 @@ public void onLoadedTopics(GedItemsLoadedEvent event) {
 
       if (root.getId() == null) {
         favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), root.getName());
+        buttonImport.init(instanceId, "0");
       } else {
         favorite.init(instanceId, root.getId(), ContentsTypes.Folder.name(), root.getName());
+        buttonImport.init(instanceId, rootTopicId);
+      }
+
+      if (canImport) {
+        addActionShortcut(buttonImport);
       }
 
       if (event.getSharing() > 0) {
@@ -135,6 +153,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();
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..ee0341ec7
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/AddFileButton.java
@@ -0,0 +1,141 @@
+/*
+ * 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.Window;
+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.pages.navigation.GedItemsLoadedEvent;
+import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationLoadedEvent;
+import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages;
+import org.silverpeas.mobile.client.apps.media.events.app.MediasLoadMediaItemsEvent;
+import org.silverpeas.mobile.client.apps.media.resources.MediaMessages;
+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;
+
+
+/**
+ * @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, folderIdValue;
+    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 folderId) {
+        this.instanceIdValue = instanceId;
+        this.folderIdValue = folderId;
+    }
+
+    @UiHandler("file")
+    void upload(ChangeEvent event) {
+      Notification.activityStartImmediately();
+      String url = UrlUtils.getUploadLocation();
+      url +=  "FileAction";
+      upload(this, file.getElement(), instanceIdValue, folderIdValue, url, SpMobil.getUserToken());
+    }
+
+    public void fileUploadedSuccessfully() {
+      EventBus.getInstance().fireEvent(new DocumentsLoadGedItemsEvent(this.instanceIdValue, this.folderIdValue, 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 folderId, 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);
+      fd.append("folderId", folderId);
+      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/resources/DocumentsMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/resources/DocumentsMessages.java
index c9d9f071c..984af7e8e 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,9 @@ public interface DocumentsMessages extends Messages {
   SafeHtml usersLabel();
   SafeHtml emailsLabel();
   SafeHtml commentsLabel();
+
+  String importFile();
+  String maxUploadError();
+
+  String fileNotSupportedError();
 }
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..78720b514 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,7 @@ maxAccessLabel=Nombre maximum d acc&egrave;s
 usersLabel=Utilisateurs
 emailsLabel=Emails externes
 commentsLabel=Message compl&eacute;mentaire
+
+importFile=Importer un fichier
+maxUploadError=Média trop volumineux
+fileNotSupportedError=Format non pris en charge
\ 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..6e8ec5f84 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,8 @@ 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
\ 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..78720b514 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,7 @@ maxAccessLabel=Nombre maximum d acc&egrave;s
 usersLabel=Utilisateurs
 emailsLabel=Emails externes
 commentsLabel=Message compl&eacute;mentaire
+
+importFile=Importer un fichier
+maxUploadError=Média trop volumineux
+fileNotSupportedError=Format non pris en charge
\ No newline at end of file
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 f230e889e..55ee5cf51 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
@@ -97,6 +97,17 @@ public void setAttachment(SimpleDocumentDTO 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");
@@ -171,6 +182,9 @@ public void onClick(ClickEvent clickEvent) {
           toogleOperations();
         }
       });
+
+      if (!isViewable()) view.setVisible(false);
+
     } catch (JavaScriptException e) {
       Notification.alert(e.getMessage());
     }
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 d20e4590d..cc8c49e5e 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
@@ -907,14 +907,14 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   background-position-x: 0.5em;
 }
 
-.add-media {
+.add-media, .add-file {
   height: 24px;
   width: 24px;
   filter: invert(1);
   background: url('icons/add.svg') no-repeat;
 }
 
-.add-media a {
+.add-media a, .add-file a {
   height: 24px;
   width: 24px;
   display: block;
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..8e255a034
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/FileServlet.java
@@ -0,0 +1,166 @@
+/*
+ * 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.apache.jackrabbit.webdav.observation.SubscriptionManager;
+import org.silverpeas.components.kmelia.service.KmeliaService;
+import org.silverpeas.components.questionreply.service.notification.SubscriptionNotifier;
+import org.silverpeas.core.contribution.publication.model.PublicationDetail;
+import org.silverpeas.core.contribution.publication.model.PublicationPK;
+import org.silverpeas.core.node.model.NodeDetail;
+import org.silverpeas.core.node.model.NodePK;
+import org.silverpeas.core.subscription.SubscriptionFactory;
+import org.silverpeas.core.subscription.SubscriptionServiceProvider;
+import org.silverpeas.core.subscription.service.ComponentSubscriptionResource;
+import org.silverpeas.core.subscription.util.SubscriptionUtil;
+import org.silverpeas.core.util.file.FileRepositoryManager;
+import org.silverpeas.core.webapi.admin.tools.SubscriptionTool;
+import org.silverpeas.core.webapi.subscribe.SubscriptionResource;
+import org.silverpeas.mobile.server.common.LocalDiskFileItem;
+
+import javax.activation.MimetypesFileTypeMap;
+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.ArrayList;
+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 processRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+  }
+
+  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+  }
+
+  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+    String componentId = "";
+    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();
+
+      }
+      else {
+        String fileName = item.getName();
+        File file = new File(tempDir + File.separator + fileName);
+        try {
+          item.write(file);
+          createPublication(request, response, fileName, getUserInSession(request).getId(), componentId, folderId, file);
+        } catch (Exception e) {
+          e.printStackTrace();
+        }
+      }
+    }
+  }
+
+  private String createPublication(HttpServletRequest request, HttpServletResponse response, String name, String userId, String componentId,
+                             String folderId, File file) throws Exception {
+
+    String type = new MimetypesFileTypeMap().getContentType(file);
+    List<FileItem> parameters = new ArrayList<FileItem>();
+    LocalDiskFileItem item = new LocalDiskFileItem(file, type);
+    parameters.add(item);
+
+    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));
+
+    //TODO : notification management
+
+    SubscriptionServiceProvider.getSubscribeService().getSubscribers()
+    return pubId;
+  }
+}
diff --git a/mobile-war/src/main/webapp/WEB-INF/web.xml b/mobile-war/src/main/webapp/WEB-INF/web.xml
index fce5560cb..83b98d3a0 100644
--- a/mobile-war/src/main/webapp/WEB-INF/web.xml
+++ b/mobile-war/src/main/webapp/WEB-INF/web.xml
@@ -96,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>

From 916eadf49b918ea6b87fc1e139f92e48b72915dc Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 6 Feb 2024 18:41:28 +0100
Subject: [PATCH 170/228] Feature #13940

---
 .../mobile/server/servlets/FileServlet.java   | 24 ++++++++-----------
 1 file changed, 10 insertions(+), 14 deletions(-)

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
index 8e255a034..e37e66862 100644
--- 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
@@ -30,20 +30,11 @@
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.commons.io.FileUtils;
-import org.apache.jackrabbit.webdav.observation.SubscriptionManager;
 import org.silverpeas.components.kmelia.service.KmeliaService;
-import org.silverpeas.components.questionreply.service.notification.SubscriptionNotifier;
 import org.silverpeas.core.contribution.publication.model.PublicationDetail;
 import org.silverpeas.core.contribution.publication.model.PublicationPK;
-import org.silverpeas.core.node.model.NodeDetail;
 import org.silverpeas.core.node.model.NodePK;
-import org.silverpeas.core.subscription.SubscriptionFactory;
-import org.silverpeas.core.subscription.SubscriptionServiceProvider;
-import org.silverpeas.core.subscription.service.ComponentSubscriptionResource;
-import org.silverpeas.core.subscription.util.SubscriptionUtil;
 import org.silverpeas.core.util.file.FileRepositoryManager;
-import org.silverpeas.core.webapi.admin.tools.SubscriptionTool;
-import org.silverpeas.core.webapi.subscribe.SubscriptionResource;
 import org.silverpeas.mobile.server.common.LocalDiskFileItem;
 
 import javax.activation.MimetypesFileTypeMap;
@@ -71,16 +62,23 @@ public void init(final ServletConfig config) throws ServletException {
     MAX_REQUEST_SIZE = (long) (MAX_FILE_SIZE * 1.1);
   }
 
-  protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
+  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
   }
 
-  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 folderId = "";
     String tempDir = FileRepositoryManager.getTemporaryPath();
@@ -159,8 +157,6 @@ private String createPublication(HttpServletRequest request, HttpServletResponse
     KmeliaService.get().addAttachmentToPublication(pk, getUserInSession(request).getId(), name, "", FileUtils.readFileToByteArray(file));
 
     //TODO : notification management
-
-    SubscriptionServiceProvider.getSubscribeService().getSubscribers()
     return pubId;
   }
 }

From aff43f77d463b80c2441522bffd2e0f4a22a765c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 7 Feb 2024 14:29:47 +0100
Subject: [PATCH 171/228] Feature #13940

---
 .../client/apps/documents/DocumentsApp.java   | 18 ++++++---
 .../pages/navigation/GedItemsLoadedEvent.java |  9 ++++-
 .../publication/PublicationLoadedEvent.java   |  7 +++-
 .../documents/pages/GedNavigationPage.java    | 15 +++-----
 .../apps/documents/pages/PublicationPage.java | 22 ++++++++++-
 .../pages/widgets/AddFileButton.java          | 37 +++++++++++++------
 .../mobile/server/servlets/FileServlet.java   | 28 +++++++++-----
 7 files changed, 94 insertions(+), 42 deletions(-)

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 7c55fb18b..0743d15c5 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
@@ -193,9 +193,6 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) {
       GedNavigationPage page = new GedNavigationPage();
       page.setPageTitle(event.getInstance().getLabel());
       page.setInstanceId(event.getInstance().getId());
-      //TODO : if writer manage validation
-      page.setCanImport(getApplicationInstance().getRights().getManager() ||
-              getApplicationInstance().getRights().getPublisher());
       page.setTopicId(null);
       page.show();
     }
@@ -242,12 +239,21 @@ 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(), event.isForceReload()));
+
+        EventBus.getInstance().fireEvent(new GedItemsLoadedEvent(result, getApplicationInstance().getFolderSharing(),
+                getCanImport(), event.isForceReload()));
       }
     };
     action.attempt();
   }
 
+  private boolean getCanImport() {
+    //TODO : if writer manage validation and manage topic specific right
+    boolean canImport = getApplicationInstance().getRights().getManager() ||
+            getApplicationInstance().getRights().getPublisher();
+    return canImport;
+  }
+
   /**
    * Get publication infos.
    */
@@ -269,8 +275,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()));
       }
     };
     action.attempt();
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 1d0bb04bd..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
@@ -34,17 +34,20 @@ public class GedItemsLoadedEvent extends AbstractGedNavigationPagesEvent {
 	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 forceReload) {
+	public GedItemsLoadedEvent(List<BaseDTO> topicsAndPublications, int sharing, boolean canImport, boolean forceReload) {
 		super();
 		this.topicsAndPublications = topicsAndPublications;
 		this.sharing = sharing;
+		this.canImport = canImport;
 		this.forceReload = forceReload;
 	}
 
@@ -62,4 +65,6 @@ public int getSharing() {
 	}
 
 	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/publication/PublicationLoadedEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationLoadedEvent.java
index b24522960..b46067105 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,9 @@ 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;
+
+  public PublicationLoadedEvent(PublicationDTO publication, boolean commentable, boolean ableToStoreContent, boolean notifiable, int sharing, String type, boolean canImport) {
     super();
     this.notifiable = notifiable;
     this.publication = publication;
@@ -41,6 +43,7 @@ public PublicationLoadedEvent(PublicationDTO publication, boolean commentable, b
     this.ableToStoreContent = ableToStoreContent;
     this.sharing = sharing;
     this.type = type;
+    this.canImport = canImport;
   }
 
   @Override
@@ -67,4 +70,6 @@ public boolean isNotifiable() {
   public String getType() { return type; }
 
   public int getSharing() { return sharing; }
+
+  public boolean isCanImport() { return canImport; }
 }
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 5acbb0a1b..12b58ee9a 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,22 +27,18 @@
 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.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.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.GedNavigationPagesEventHandler;
 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;
 import org.silverpeas.mobile.client.apps.favorites.pages.widgets.AddToFavoritesButton;
-import org.silverpeas.mobile.client.apps.media.pages.widgets.AddMediaButton;
 import org.silverpeas.mobile.client.common.EventBus;
 import org.silverpeas.mobile.client.common.Notification;
 import org.silverpeas.mobile.client.common.app.View;
@@ -96,7 +92,7 @@ public void setTopicId(String rootTopicId) {
     EventBus.getInstance().fireEvent(new DocumentsLoadGedItemsEvent(instanceId, rootTopicId));
   }
 
-  public void setCanImport(boolean canImport) {
+  private void setCanImport(boolean canImport) {
     this.canImport = canImport;
   }
 
@@ -107,6 +103,7 @@ public void setInstanceId(String instanceId) {
   @Override
   public void onLoadedTopics(GedItemsLoadedEvent event) {
     if ((isVisible() && dataLoaded == false) || (isVisible() && event.isForceReload())) {
+      setCanImport(event.isCanImport());
       Notification.activityStart();
       list.clear();
       List<BaseDTO> dataItems = event.getTopicsAndPublications();
@@ -126,10 +123,10 @@ public void onLoadedTopics(GedItemsLoadedEvent event) {
 
       if (root.getId() == null) {
         favorite.init(instanceId, instanceId, ContentsTypes.Component.name(), root.getName());
-        buttonImport.init(instanceId, "0");
+        buttonImport.init(instanceId, "0", false);
       } else {
         favorite.init(instanceId, root.getId(), ContentsTypes.Folder.name(), root.getName());
-        buttonImport.init(instanceId, rootTopicId);
+        buttonImport.init(instanceId, rootTopicId, false);
       }
 
       if (canImport) {
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 f41157f3d..3e44a3511 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
@@ -26,7 +26,6 @@
 
 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;
@@ -34,7 +33,10 @@
 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 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;
@@ -43,6 +45,7 @@
 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.pages.widgets.AddFileButton;
 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;
@@ -97,8 +100,11 @@ public class PublicationPage extends PageContent
   private NotifyButton notification = new NotifyButton();
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
 
+  private AddFileButton buttonImport = new AddFileButton();
+
   private ShareButton share = new ShareButton();
   private ContentDTO contentDTO = null;
+  private boolean canImport = false;
 
   private SwipeRecognizer swipeRecognizer;
 
@@ -128,6 +134,7 @@ public PublicationPage() {
     attachments.getElement().setId("attachments");
     linkedPublications.getElement().setId("linkedPublications");
     content.setId("content");
+    buttonImport.setId("import");
     content.getStyle().setDisplay(Style.Display.NONE);
     EventBus.getInstance().addHandler(AbstractPublicationPagesEvent.TYPE, this);
     EventBus.getInstance().addHandler(SwipeEndEvent.getType(), this);
@@ -145,6 +152,10 @@ 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();
@@ -158,6 +169,8 @@ public void setPublicationId(String id, String type) {
   @Override
   public void onLoadedPublication(PublicationLoadedEvent event) {
     Notification.activityStop();
+    attachments.clear();
+    setCanImport(event.isCanImport());
     this.publication = event.getPublication();
     this.notifiable = event.isNotifiable();
     display(event.isCommentable(), event.isAbleToStoreContent(), event.getType());
@@ -179,6 +192,11 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
       contentLink.setVisible(publication.getContent());
     }
     swipeRecognizer = new SwipeRecognizer(supercontainer);
+
+    if (canImport) {
+      buttonImport.init(event.getPublication().getInstanceId(), event.getPublication().getId(), true);
+      addActionShortcut(buttonImport);
+    }
   }
 
   @Override
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
index ee0341ec7..4a5be2947 100644
--- 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
@@ -32,23 +32,21 @@
 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.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.pages.navigation.GedItemsLoadedEvent;
-import org.silverpeas.mobile.client.apps.documents.events.pages.publication.PublicationLoadedEvent;
+import org.silverpeas.mobile.client.apps.documents.events.app.DocumentsLoadPublicationEvent;
 import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages;
-import org.silverpeas.mobile.client.apps.media.events.app.MediasLoadMediaItemsEvent;
-import org.silverpeas.mobile.client.apps.media.resources.MediaMessages;
 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;
 
 
 /**
@@ -63,7 +61,8 @@ interface AddFileButtonUiBinder extends UiBinder<Widget, AddFileButton> {
     @UiField(provided = true) protected DocumentsMessages msg = null;
 
 
-    private String instanceIdValue, folderIdValue;
+    private String instanceIdValue, locationIdValue;
+    private boolean locationIsPublication = false;
     private ApplicationMessages globalMsg = GWT.create(ApplicationMessages.class);
 
     private static AddFileButtonUiBinder uiBinder = GWT.create(AddFileButtonUiBinder.class);
@@ -77,9 +76,10 @@ public AddFileButton() {
         file.getElement().getStyle().setDisplay(Style.Display.NONE);
     }
 
-    public void init(String instanceId, String folderId) {
+    public void init(String instanceId, String locationId, boolean locationIsPublication) {
         this.instanceIdValue = instanceId;
-        this.folderIdValue = folderId;
+        this.locationIdValue = locationId;
+        this.locationIsPublication = locationIsPublication;
     }
 
     @UiHandler("file")
@@ -87,11 +87,20 @@ void upload(ChangeEvent event) {
       Notification.activityStartImmediately();
       String url = UrlUtils.getUploadLocation();
       url +=  "FileAction";
-      upload(this, file.getElement(), instanceIdValue, folderIdValue, url, SpMobil.getUserToken());
+      upload(this, file.getElement(), instanceIdValue, locationIdValue, locationIsPublication, url, SpMobil.getUserToken());
     }
 
     public void fileUploadedSuccessfully() {
-      EventBus.getInstance().fireEvent(new DocumentsLoadGedItemsEvent(this.instanceIdValue, this.folderIdValue, true));
+        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) {
@@ -113,7 +122,7 @@ void upload(ClickEvent event) {
         }
     }
 
-    private static native void upload(AddFileButton button, Element input, String componentId, String folderId, String url, String token) /*-{
+    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);
@@ -127,7 +136,11 @@ private static native void upload(AddFileButton button, Element input, String co
         }
       };
       fd.append("componentId", componentId);
-      fd.append("folderId", folderId);
+      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]);
       }
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
index e37e66862..429c953f9 100644
--- 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
@@ -35,16 +35,13 @@
 import org.silverpeas.core.contribution.publication.model.PublicationPK;
 import org.silverpeas.core.node.model.NodePK;
 import org.silverpeas.core.util.file.FileRepositoryManager;
-import org.silverpeas.mobile.server.common.LocalDiskFileItem;
 
-import javax.activation.MimetypesFileTypeMap;
 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.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
@@ -80,6 +77,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
 
 
     String componentId = "";
+    String publicationId = "";
     String folderId = "";
     String tempDir = FileRepositoryManager.getTemporaryPath();
 
@@ -119,6 +117,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
       {
         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 {
@@ -126,7 +125,11 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
         File file = new File(tempDir + File.separator + fileName);
         try {
           item.write(file);
-          createPublication(request, response, fileName, getUserInSession(request).getId(), componentId, folderId, file);
+          if(folderId.isEmpty()) {
+            addFileToPublication(request, fileName, componentId, publicationId, file);
+          } else {
+            createPublication(request, fileName, componentId, folderId, file);
+          }
         } catch (Exception e) {
           e.printStackTrace();
         }
@@ -134,13 +137,18 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
     }
   }
 
-  private String createPublication(HttpServletRequest request, HttpServletResponse response, String name, String userId, String componentId,
-                             String folderId, File file) throws Exception {
+  private void addFileToPublication(HttpServletRequest request, String name, String componentId, String publicationId,
+                                    File file) throws Exception {
 
-    String type = new MimetypesFileTypeMap().getContentType(file);
-    List<FileItem> parameters = new ArrayList<FileItem>();
-    LocalDiskFileItem item = new LocalDiskFileItem(file, type);
-    parameters.add(item);
+    PublicationPK pk = new PublicationPK(publicationId, componentId);
+    KmeliaService.get().addAttachmentToPublication(pk, getUserInSession(request).getId(), name, "",
+            FileUtils.readFileToByteArray(file));
+
+    //TODO : notification management
+  }
+
+  private String createPublication(HttpServletRequest request, String name,
+                                   String componentId, String folderId, File file) throws Exception {
 
     PublicationDetail pub = PublicationDetail.builder().build();
     pub.setName(file.getName());

From d41dcabf7e3e14e1a2104cf1882e2b04c57bddcd Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 7 Feb 2024 15:55:34 +0100
Subject: [PATCH 172/228] Feature #13940

---
 .../mobile/server/servlets/FileServlet.java        | 14 +++++++++++---
 .../mobile/server/servlets/MediaServlet.java       |  8 ++++++++
 2 files changed, 19 insertions(+), 3 deletions(-)

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
index 429c953f9..1d45e6c01 100644
--- 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
@@ -34,6 +34,9 @@
 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;
@@ -143,8 +146,6 @@ private void addFileToPublication(HttpServletRequest request, String name, Strin
     PublicationPK pk = new PublicationPK(publicationId, componentId);
     KmeliaService.get().addAttachmentToPublication(pk, getUserInSession(request).getId(), name, "",
             FileUtils.readFileToByteArray(file));
-
-    //TODO : notification management
   }
 
   private String createPublication(HttpServletRequest request, String name,
@@ -164,7 +165,14 @@ private String createPublication(HttpServletRequest request, String name,
 
     KmeliaService.get().addAttachmentToPublication(pk, getUserInSession(request).getId(), name, "", FileUtils.readFileToByteArray(file));
 
-    //TODO : notification management
+
+    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();
   }
 }

From 45e1e26f07ebe3dcdd8ca01abfd7e7a13fe4342c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 7 Feb 2024 17:30:29 +0100
Subject: [PATCH 173/228] Fix personnal EDM Label

---
 .../mobile/client/apps/documents/DocumentsApp.java |  2 ++
 .../apps/documents/pages/GedNavigationPage.java    | 14 +++++++++++++-
 .../client/components/base/NavigationMenu.java     |  1 -
 .../mobile/server/services/ServiceNavigation.java  |  4 +++-
 4 files changed, 18 insertions(+), 3 deletions(-)

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 0743d15c5..e580ce63d 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
@@ -194,6 +194,7 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) {
       page.setPageTitle(event.getInstance().getLabel());
       page.setInstanceId(event.getInstance().getId());
       page.setTopicId(null);
+      page.setPersonnal(event.getInstance().isPersonnal());
       page.show();
     }
   }
@@ -248,6 +249,7 @@ public void onSuccess(final Method method, final List<BaseDTO> result) {
   }
 
   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();
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 12b58ee9a..85a690de5 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
@@ -44,6 +44,7 @@
 import org.silverpeas.mobile.client.common.app.View;
 import org.silverpeas.mobile.client.components.UnorderedList;
 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;
@@ -67,9 +68,16 @@ public class GedNavigationPage extends PageContent implements View, GedNavigatio
   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> {
   }
 
@@ -109,7 +117,11 @@ public void onLoadedTopics(GedItemsLoadedEvent event) {
       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());
+          }
           root = (TopicDTO) dataItem;
         } else {
           GedItem item = new GedItem();
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 11d5affaa..e70b075ee 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
@@ -122,7 +122,6 @@ public NavigationMenu() {
   public void setPersonalApps(List<ApplicationInstanceDTO> applicationInstanceDTOS) {
     listApplications.clear();
     for (ApplicationInstanceDTO app : applicationInstanceDTOS) {
-
       if (app.getType().equals(Apps.kmelia.name())) {
         app.setLabel(msg.myDocuments());
       }
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 849fa2fff..cfb0de277 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
@@ -473,7 +473,9 @@ public List<ApplicationInstanceDTO> getPersonnalSpaceContent(@PathParam("userId"
       SpaceInst space = Administration.get().getPersonalSpace(userId);
       List<ApplicationInstanceDTO> apps = new ArrayList<>();
       for (ComponentInst app : space.getAllComponentsInst()) {
-        apps.add(populate(app));
+        ApplicationInstanceDTO dto = populate(app);
+        dto.setPersonnal(true);
+        apps.add(dto);
       }
       return apps;
     } catch (AdminException e) {

From 4a5a5e982b9ecec34f8a6d388f8d15919c19d5d9 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 8 Feb 2024 15:17:17 +0100
Subject: [PATCH 174/228] Fix #13981

---
 .../server/services/ServiceNavigation.java    | 20 ++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

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 cfb0de277..1b11e503e 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
@@ -24,10 +24,13 @@
 
 package org.silverpeas.mobile.server.services;
 
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.IFrameElement;
 import org.apache.commons.lang3.EnumUtils;
 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.kmelia.service.KmeliaService;
 import org.silverpeas.components.quickinfo.model.News;
 import org.silverpeas.core.admin.component.model.ComponentInst;
 import org.silverpeas.core.admin.component.model.ComponentInstLight;
@@ -361,9 +364,12 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
                 getSettings().getBoolean("spacehomepage.displayUrlType")) {
           String url = space.getFirstPageExtraParam();
           if (url.startsWith("/") && !url.startsWith("/silverpeas") && !url.startsWith("$")) url = "/silverpeas" + url;
-          String html =
-                  "<iframe frameborder='0' style='width:100vw;height:100vh' src='" + url +
-                          "'></iframe>";
+          String html = getIframe(url);
+          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);
           data.setHtmlFreeZone(html);
         }
       }
@@ -385,6 +391,14 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
     return data;
   }
 
+  private String getIframe(String url) {
+    String style = "border-style: none; width: 100%; overflow: hidden;";
+    String script = "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';}(this));";
+    String html = "<iframe style='" + style + "' src='" + url + "' onload=\"" + script + "\">";
+    html += "</iframe>";
+    return html;
+  }
+
   private List<ComponentInstLight> getAllowedComponents(boolean visibleOnly, String name,
       String spaceId) {
     OrganizationController oc = OrganizationController.get();

From 28b305fd77fd370376e4d661f80e2182512a4dfe Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 8 Feb 2024 16:28:56 +0100
Subject: [PATCH 175/228] embbed shortcuts

---
 .../client/components/base/PageFooter.java    |  7 +++++++
 .../client/components/base/PageFooter.ui.xml  | 10 +++++-----
 .../resources/ApplicationResources.java       | 20 +++++++++++++++++++
 .../mobile/public/icons/chat_shortcut.svg     |  1 -
 .../mobile/public/icons/home_shortcut.svg     |  1 -
 .../{chat.svg => shortcuts/chat_shortcut.svg} |  2 +-
 .../{ => shortcuts}/contacts_shortcut.svg     |  2 +-
 .../{ => shortcuts}/favorites_shortcut.svg    |  2 +-
 .../public/icons/shortcuts/home_shortcut.svg  |  1 +
 .../public/icons/shortcuts/tasks_shortcut.svg |  1 +
 .../silverpeas/mobile/public/icons/tasks.svg  |  1 -
 .../mobile/public/icons/tasks_shortcut.svg    |  1 -
 12 files changed, 37 insertions(+), 12 deletions(-)
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat_shortcut.svg
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.svg
 rename mobile-war/src/main/java/org/silverpeas/mobile/public/icons/{chat.svg => shortcuts/chat_shortcut.svg} (75%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/public/icons/{ => shortcuts}/contacts_shortcut.svg (88%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/public/icons/{ => shortcuts}/favorites_shortcut.svg (78%)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/home_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/tasks_shortcut.svg
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks.svg
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks_shortcut.svg

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 37768a596..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
@@ -67,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();
   }
 
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/resources/ApplicationResources.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java
index d8b1fe97f..bbaa90aff 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
@@ -128,5 +128,25 @@ public interface ApplicationResources extends ClientBundle {
   @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();
+
 }
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat_shortcut.svg
deleted file mode 100644
index 960bb0c16..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat_shortcut.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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" fill="#7eb73b"/></svg>
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.svg
deleted file mode 100644
index ffbb6ce97..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/home_shortcut.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" fill="#7eb73b"/></svg>
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/chat_shortcut.svg
similarity index 75%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/chat_shortcut.svg
index 4ce311b89..b4af4b1bf 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/chat.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/chat_shortcut.svg
@@ -1 +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>
\ No newline at end of file
+<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/contacts_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/contacts_shortcut.svg
similarity index 88%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts_shortcut.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/contacts_shortcut.svg
index 19ef8754c..83277867a 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/contacts_shortcut.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/contacts_shortcut.svg
@@ -1 +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="#7eb73b"/></svg>
+<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/favorites_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/favorites_shortcut.svg
similarity index 78%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/favorites_shortcut.svg
index 4d6428b73..d090bc060 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/favorites_shortcut.svg
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/shortcuts/favorites_shortcut.svg
@@ -1 +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" fill="#7eb73b"/></svg>
+<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/tasks.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks.svg
deleted file mode 100644
index 410991a61..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><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>
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks_shortcut.svg b/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks_shortcut.svg
deleted file mode 100644
index 4447876ec..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/tasks_shortcut.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><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" fill="#7eb73b"/></svg>

From 7535c6de1908913ec50ddc445fdd08873e3f5abd Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 8 Feb 2024 17:24:58 +0100
Subject: [PATCH 176/228] embbed icons menu

---
 .../components/base/NavigationMenu.java       |  7 +++-
 .../components/base/NavigationMenu.ui.xml     | 20 ++++++++--
 .../resources/ApplicationResources.java       | 15 ++++++++
 .../client/resources/icons/menu/help.svg      |  1 +
 .../client/resources/icons/menu/home.svg      |  1 +
 .../client/resources/icons/menu/logout.svg    |  1 +
 .../client/resources/icons/menu/settings.svg  |  1 +
 .../icons/shortcuts/chat_shortcut.svg         |  1 +
 .../icons/shortcuts/contacts_shortcut.svg     |  1 +
 .../icons/shortcuts/favorites_shortcut.svg    |  1 +
 .../icons/shortcuts/home_shortcut.svg         |  1 +
 .../icons/shortcuts/tasks_shortcut.svg        |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 37 +++++++------------
 13 files changed, 59 insertions(+), 29 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/help.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/home.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/logout.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/settings.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/chat_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/contacts_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/favorites_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/home_shortcut.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/shortcuts/tasks_shortcut.svg

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 e70b075ee..6bb16910f 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
@@ -80,7 +80,7 @@ public class NavigationMenu extends Composite implements PageEventHandler {
 
   @UiField HTMLPanel container, user;
   @UiField Anchor home, disconnect, updateStatus, searchButton, help, config, calendar, notifications, shares;
-  @UiField SpanElement status;
+  @UiField SpanElement status, iconHelp, iconSettings, iconHome, iconLogout;
   @UiField TextBox search;
   @UiField AvatarUpload avatar;
 
@@ -116,6 +116,11 @@ 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());
+
     EventBus.getInstance().addHandler(AbstractPageEvent.TYPE, this);
   }
 
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 3c35704ba..0bd6a609a 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
@@ -51,10 +51,22 @@
       <components:UnorderedList ui:field="listApplications" />
 
       <ul id="actions-menu">
-        <li id="menu-home"><g:Anchor ui:field="home" styleName="ui-link" text="{msg.home}"/></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-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/resources/ApplicationResources.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java
index bbaa90aff..52d2db168 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
@@ -147,6 +147,21 @@ public interface ApplicationResources extends ClientBundle {
   @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();
 
 }
 
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/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/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/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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index cc8c49e5e..dc6e0aeb5 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
@@ -449,33 +449,30 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #navigation-footer a {
-  bottom: 0;
-  top: auto;
+  margin: auto;
+  text-align: center;
   flex: 1;
-  text-indent: -300em;
   transform: scale(1.5);
+  fill: #7eb73b;
 }
 
 #navigation-footer .btn-list-navigation {
-  background: transparent url('icons/home_shortcut.svg') center no-repeat;
+
 }
 
 #navigation-footer .btn-find-contact {
-  background: transparent url('icons/contacts_shortcut.svg') center no-repeat;
-    transform: scale(1.2);
+  transform: scale(1.2);
 }
 
 #navigation-footer .btn-update-tchat {
-  background: transparent url('icons/chat_shortcut.svg') center no-repeat;
-    transform: scale(1.2);
+  transform: scale(1.2);
 }
 
 #navigation-footer .btn-list-task {
-  background: transparent url('icons/tasks_shortcut.svg') center no-repeat;
+
 }
 
 #navigation-footer .btn-list-favoris {
-  background: transparent url('icons/favorites_shortcut.svg') center no-repeat;
   transform: scale(1.4);
 }
 
@@ -735,16 +732,13 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   background: none;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-config a {
-  background: transparent url('icons/settings.svg') no-repeat;
+#actions-menu li {
+  fill: #7eb73b;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-tasks a {
-  background: transparent url('icons/tasks.svg') no-repeat;
-}
-
-#silverpeas-navmenu-panel #actions-menu li#menu-help a {
-  background: transparent url('icons/help.svg') no-repeat;
+#actions-menu li span {
+  position: absolute;
+  left: 0.5em;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-notificationsbox a {
@@ -756,20 +750,15 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #silverpeas-navmenu-panel #actions-menu li#menu-parameter a {
-  background: transparent url('icons/settings.svg') no-repeat;
+
 }
 
 #silverpeas-navmenu-panel #actions-menu li#menu-home a {
-  background: transparent url('icons/home.svg') no-repeat;
 
 }
 
 #silverpeas-navmenu-panel #actions-menu li#menu-logout a {
-  background: transparent url('icons/logout.svg') no-repeat;
-}
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-tchat a {
-  background: transparent url('icons/chat.svg') no-repeat;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li#menu-usercalendar a {

From 047cf5a9b26c8281507d8877d3739e1109f2e887 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 8 Feb 2024 18:11:20 +0100
Subject: [PATCH 177/228] embbed favorite icon

---
 .../navigation/pages/widgets/FavoriteItem.java | 10 +++++++++-
 .../pages/widgets/FavoriteItem.ui.xml          |  3 +--
 .../client/resources/ApplicationResources.java |  4 ++++
 .../resources}/icons/star.svg                  |  0
 .../org/silverpeas/mobile/public/spmobile.css  | 18 +++++++++++-------
 5 files changed, 25 insertions(+), 10 deletions(-)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public => client/resources}/icons/star.svg (100%)

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 270482ac5..0f18f0e5c 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,6 +25,7 @@
 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.event.dom.client.ClickEvent;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
@@ -34,6 +35,7 @@
 import com.google.gwt.user.client.ui.Widget;
 import org.silverpeas.mobile.client.common.navigation.LinksManager;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
+import org.silverpeas.mobile.client.resources.ApplicationResources;
 import org.silverpeas.mobile.shared.dto.MyLinkDTO;
 import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 
@@ -44,6 +46,11 @@ public class FavoriteItem extends Composite {
   @UiField Anchor link;
   protected ApplicationMessages msg = null;
 
+  private ApplicationResources resources = GWT.create(ApplicationResources.class);
+
+  @UiField
+  SpanElement icon;
+
 
   interface FavoriteItemUiBinder extends UiBinder<Widget, FavoriteItem> {
   }
@@ -51,6 +58,7 @@ interface FavoriteItemUiBinder extends UiBinder<Widget, FavoriteItem> {
   public FavoriteItem() {
     initWidget(uiBinder.createAndBindUi(this));
     msg = GWT.create(ApplicationMessages.class);
+    icon.setInnerHTML(resources.favorite().getText());
   }
 
   public void setData(MyLinkDTO data) {
@@ -74,4 +82,4 @@ protected void onClick(ClickEvent event) {
     LinksManager.processLink(link);
   }
 
-}
\ No newline at end of file
+}
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..ace0654ff 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
@@ -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">
-	
+		<span ui:field="icon" class="icon-app"></span>
 		<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/resources/ApplicationResources.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationResources.java
index 52d2db168..df93d10f4 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
@@ -43,6 +43,10 @@ public interface ApplicationResources extends ClientBundle {
   @Source("icons/offline.png")
   ImageResource offline();
 
+  @Source("icons/star.svg")
+  @DataResource.MimeType("image/svg+xml")
+  TextResource favorite();
+
   @Source("icons/call.svg")
   @DataResource.MimeType("image/svg+xml")
   TextResource call();
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/public/icons/star.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/star.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/star.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/star.svg
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 dc6e0aeb5..3f6d3f4be 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
@@ -547,11 +547,13 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   font-size: 0.8em;
 }
 
+.favoris-bloc span {
+  top:0.25em;
+  fill : #a9a9a9;
+}
+
 .favoris-bloc a {
   padding-left: 2.5em;
-  font-size: 0.95em;
-  background: transparent url('icons/star.svg') no-repeat;
-  background-size: auto;
 }
 
 .racourcis-bloc a {
@@ -2109,10 +2111,12 @@ form .forms .fields > li:nth-child(even) {
 }
 
 .ui-listview.favoris a {
-  background: transparent url('icons/star.svg') no-repeat;
-  background-size: auto;
-  background-position-y: center;
-  padding-left: 2em;
+  padding-left: 2.5em;
+}
+
+.ui-listview.favoris span {
+  top: 0.25em;
+  fill : #a9a9a9;
 }
 
 /*** Popup ***/

From 3cda45470538cf815a46eadb30ff87c135ca9773 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 9 Feb 2024 10:52:28 +0100
Subject: [PATCH 178/228] Feature #13982

---
 .../org/silverpeas/mobile/mobileSettings.properties |  3 +++
 .../server/servlets/PublicationContentServlet.java  | 13 +++++--------
 2 files changed, 8 insertions(+), 8 deletions(-)

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 5e6857bc0..c7c84ee5a 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,9 @@
 # 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
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 083924f12..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>");

From 7d218dba8befa8b08dec8cdf1e3191a9d37136f4 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 12 Feb 2024 17:11:58 +0100
Subject: [PATCH 179/228] Feature #13988

---
 .../mobile/client/apps/tasks/TasksApp.java    | 25 +++++--
 .../events/app/TasksAppEventHandler.java      |  2 +
 .../tasks/events/app/TasksDeleteEvent.java    | 48 +++++++++++++
 .../client/apps/tasks/pages/TasksPage.java    | 66 +++++++++++++++--
 .../client/apps/tasks/pages/TasksPage.ui.xml  |  1 -
 .../tasks/pages/widgets/AddTaskButton.java    |  2 +-
 .../tasks/pages/widgets/DeleteTaskButton.java | 59 +++++++++++++++
 .../pages/widgets/DeleteTaskButton.ui.xml     | 32 +++++++++
 .../apps/tasks/pages/widgets/TaskItem.java    | 72 ++++++++++++++++---
 .../apps/tasks/resources/TasksMessages.java   |  2 +
 .../tasks/resources/TasksMessages.properties  |  1 +
 .../resources/TasksMessages_en.properties     |  2 +-
 .../resources/TasksMessages_fr.properties     |  2 +-
 .../client/components/base/ActionItem.java    | 10 +++
 .../client/components/base/PageContent.java   | 11 ++-
 .../client/components/base/PageHeader.java    |  4 ++
 .../silverpeas/mobile/public/icons/delete.svg |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 12 +++-
 .../mobile/server/services/ServiceTask.java   | 17 +++--
 .../shared/services/rest/ServiceTask.java     | 13 ++--
 20 files changed, 343 insertions(+), 39 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/events/app/TasksDeleteEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.ui.xml
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/delete.svg

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 649710a8b..9acbfcb9e 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,7 +27,9 @@
 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;
@@ -35,14 +37,17 @@
 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.AddTaskButton;
+import org.silverpeas.mobile.client.apps.tasks.pages.widgets.DeleteTaskButton;
 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.ActionsList;
 import org.silverpeas.mobile.client.components.base.PageContent;
 import org.silverpeas.mobile.shared.dto.TaskDTO;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 
 /**
@@ -50,19 +55,23 @@
  */
 public class TasksPage extends PageContent implements TasksPagesEventHandler {
 
-
   interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
   private static TasksPageUiBinder uiBinder = GWT.create(TasksPageUiBinder.class);
   private AddTaskButton buttonCreate = new AddTaskButton();
+
+  private DeleteTaskButton buttonDelete = new DeleteTaskButton();
   @UiField HTMLPanel container;
   @UiField
   UnorderedList list;
 
-  @UiField
-  ActionsList actionsShortcuts;
+  private boolean selectionMode = false;
+  private int changeSelectionNumber = 0;
+
+  private TasksMessages msg = GWT.create(TasksMessages .class);
 
   public TasksPage() {
     initWidget(uiBinder.createAndBindUi(this));
+    list.getElement().setId("tasks");
     EventBus.getInstance().fireEvent(new TasksLoadEvent());
     EventBus.getInstance().addHandler(AbstractTasksPagesEvent.TYPE, this);
   }
@@ -70,12 +79,15 @@ public TasksPage() {
   @Override
   public void onTaskLoad(final TasksLoadedEvent event) {
     Notification.activityStop();
+    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);
       }
@@ -85,6 +97,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);
   }
@@ -112,4 +125,49 @@ public void stop() {
     super.stop();
     EventBus.getInstance().removeHandler(AbstractTasksPagesEvent.TYPE, this);
   }
+
+  public boolean isSelectionMode() {
+    return selectionMode;
+  }
+
+  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();
+  }
+
+  public void setSelectionMode(boolean selectionMode) {
+
+    this.selectionMode = selectionMode;
+    if (selectionMode) {
+      clearActions();
+      buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedTasks();}});
+      addActionShortcut(buttonDelete);
+    } else {
+      clearActions();
+      addActionShortcut(buttonCreate);
+    }
+    for (int i = 0; i < list.getCount(); i++) {
+      TaskItem item = (TaskItem) list.getWidget(i);
+      item.setSelectionMode(selectionMode);
+    }
+  }
+  public void changeSelectionNumber(int i) {
+    changeSelectionNumber = changeSelectionNumber + i;
+    if (changeSelectionNumber == 0) {
+      setSelectionMode(false);
+    }
+  }
 }
\ 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 cfbb3dc50..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
@@ -28,7 +28,6 @@
              xmlns:components="urn:import:org.silverpeas.mobile.client.components">
 
   <g:HTMLPanel ui:field="container" styleName="ui-content ui-body-a tasks">
-    <base:ActionsList ui:field="actionsShortcuts"/>
     <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/AddTaskButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.java
index 4f029ef90..41753a157 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.java
@@ -30,7 +30,6 @@
 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;
@@ -51,6 +50,7 @@ interface AddTaskItemUiBinder extends UiBinder<Widget, AddTaskButton> {
 
   public AddTaskButton() {
     msg = GWT.create(TasksMessages.class);
+    setId("add-task");
     initWidget(uiBinder.createAndBindUi(this));
   }
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java
new file mode 100644
index 000000000..736e6c613
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java
@@ -0,0 +1,59 @@
+/*
+ * 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.pages.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.Widget;
+import org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages;
+import org.silverpeas.mobile.client.components.base.ActionItem;
+
+/**
+ * @author: svu
+ */
+public class DeleteTaskButton extends ActionItem {
+
+  interface DeleteTaskItemUiBinder extends UiBinder<Widget, DeleteTaskButton> {
+  }
+
+  @UiField Anchor link;
+  @UiField(provided = true) protected TasksMessages msg = null;
+
+  private static DeleteTaskItemUiBinder uiBinder = GWT.create(DeleteTaskItemUiBinder.class);
+  public DeleteTaskButton() {
+    setId("delete-task");
+    msg = GWT.create(TasksMessages.class);
+    initWidget(uiBinder.createAndBindUi(this));
+  }
+
+  @UiHandler("link")
+  void deleteTasks(ClickEvent event) {
+    getCallback().execute();
+  }
+}
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.ui.xml
new file mode 100644
index 000000000..93e99db44
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.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/>.
+  -->
+
+<!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'/>
+
+  <g:HTMLPanel tag="li" ui:field="container" styleName="delete-task">
+    <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/tasks/pages/widgets/TaskItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/TaskItem.java
index 65dcffd92..288dfc44f 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,10 +25,11 @@
 package org.silverpeas.mobile.client.apps.tasks.pages.widgets;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 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.*;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.uibinder.client.UiHandler;
@@ -37,6 +38,7 @@
 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.pages.TasksPage;
 import org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages;
 import org.silverpeas.mobile.shared.dto.TaskDTO;
 
@@ -53,6 +55,9 @@ public class TaskItem extends Composite {
 
   private TaskDTO task;
 
+  private TasksPage parent;
+
+  private boolean selectionMode = false;
   interface ContactItemUiBinder extends UiBinder<Widget, TaskItem> {
   }
 
@@ -82,27 +87,74 @@ public void setData(TaskDTO data) {
     updateRange(data.getPercentCompleted());
   }
 
+  public void setParent(TasksPage page) {
+    this.parent = page;
+  }
   public TaskDTO getData() {
     return task;
   }
 
   @UiHandler("link")
-  protected void edit(ClickEvent event) {
-    if (task.getExternalId().isEmpty()) {
-      TaskPage page = new TaskPage();
-      page.setPageTitle(msg.edit());
-      page.setData(task);
-      page.show();
+  protected void startTouch(TouchStartEvent event) {
+    if (!parent.isSelectionMode()) {
+      Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
+        @Override
+        public boolean execute() {
+          selectionMode = true;
+          container.getElement().addClassName("selected");
+          return false;
+        }
+      }, 400);
+    }
+  }
+
+  public boolean isSelected() {
+    return container.getElement().hasClassName("selected");
+  }
+
+  @UiHandler("link")
+  protected void endTouch(TouchEndEvent event) {
+    if (parent.isSelectionMode()) {
+      if (container.getElement().hasClassName("selected")) {
+        container.getElement().removeClassName("selected");
+        parent.changeSelectionNumber(-1);
+      } else {
+        container.getElement().addClassName("selected");
+        parent.changeSelectionNumber(1);
+      }
     } else {
-      //TODO : redirect on content
+      if (selectionMode) {
+        container.getElement().addClassName("selected");
+        parent.changeSelectionNumber(1);
+        parent.setSelectionMode(true);
+      } else {
+        if (task.getExternalId().isEmpty()) {
+          TaskPage page = new TaskPage();
+          page.setPageTitle(msg.edit());
+          page.setData(task);
+          page.show();
+          Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
+            @Override
+            public boolean execute() {
+              selectionMode = false;
+              container.getElement().removeClassName("selected");
+              return false;
+            }
+          }, 400);
+        } else {
+          //TODO : redirect on content
+        }
+      }
     }
   }
 
+  public void setSelectionMode(boolean mode) {
+    this.selectionMode = mode;
+  }
+
   private void updateRange(final int value) {
     double val = value / 100.0;
     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/resources/TasksMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/resources/TasksMessages.java
index 63560ebab..eed5d5f93 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
@@ -32,4 +32,6 @@ public interface TasksMessages extends Messages {
   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..0202fdb34 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
@@ -27,4 +27,5 @@ 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..ecf0696df 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
@@ -27,4 +27,4 @@ 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..ba18574b9 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
@@ -27,4 +27,4 @@ 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/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/PageContent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageContent.java
index 7eabf4035..7b1e3c994 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
@@ -33,7 +33,6 @@
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.Event.NativePreviewEvent;
 import com.google.gwt.user.client.Event.NativePreviewHandler;
-import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Composite;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.common.EventBus;
@@ -98,6 +97,16 @@ public void addActionShortcut(ActionItem 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);
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 ecce4202c..252da0279 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
@@ -71,6 +71,10 @@ public void addActionShortcut(ActionItem action) {
     actionsShortcuts.addAction(action);
   }
 
+  public void removeActionShortcut(ActionItem action) {
+    actionsShortcuts.removeAction(action.getId(), true);
+  }
+
   public void addActionMenu(ActionItem action) {
     actionsMenu.addAction(action);
   }
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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 3f6d3f4be..f6663b3d2 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
@@ -803,7 +803,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 2.5em;
 }
 
-#actionsList:has(.add-task) {
+#actionsList:has(.add-task),  #actionsList:has(.delete-task){
   right: 1em;
 }
 
@@ -813,8 +813,14 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   filter: invert(1);
   background: url('icons/add.svg') no-repeat;
 }
+.delete-task {
+  height: 24px;
+  width: 24px;
+  filter: invert(1);
+  background: url('icons/delete.svg') no-repeat;
+}
 
-.add-task a {
+.add-task a, .delete-task a {
   height: 24px;
   width: 24px;
   display: block;
@@ -1457,7 +1463,7 @@ li > #operations {
   width: 2em;
 }
 
-#notification .list-notifications > li.selected, .list-resources > li.selected {
+#notification .list-notifications > li.selected, .list-resources > li.selected, #tasks > li.selected {
   border-left: 8px solid #7eb73a;
   color: #000
 }
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/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)

From 55d76acc32d6aca3c3cfbd0052e1ef6354edeab2 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 12 Feb 2024 17:57:58 +0100
Subject: [PATCH 180/228] Feature #13988 : generalisation

---
 .../client/apps/tasks/pages/TasksPage.java    | 16 +----
 .../apps/tasks/pages/widgets/TaskItem.java    | 60 +++--------------
 .../client/components/base/PageContent.java   | 18 +++++
 .../base/widgets/SelectableItem.java          | 66 +++++++++++++++++++
 4 files changed, 96 insertions(+), 64 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SelectableItem.java

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 9acbfcb9e..1a67df1a8 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
@@ -64,9 +64,6 @@ interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
   @UiField
   UnorderedList list;
 
-  private boolean selectionMode = false;
-  private int changeSelectionNumber = 0;
-
   private TasksMessages msg = GWT.create(TasksMessages .class);
 
   public TasksPage() {
@@ -126,10 +123,6 @@ public void stop() {
     EventBus.getInstance().removeHandler(AbstractTasksPagesEvent.TYPE, this);
   }
 
-  public boolean isSelectionMode() {
-    return selectionMode;
-  }
-
   private void deleteSelectedTasks() {
     PopinConfirmation popin = new PopinConfirmation(msg.deleteConfirmation());
     popin.setYesCallback(new Command() {
@@ -148,9 +141,10 @@ public void execute() {
     popin.show();
   }
 
+  @Override
   public void setSelectionMode(boolean selectionMode) {
+    super.setSelectionMode(selectionMode);
 
-    this.selectionMode = selectionMode;
     if (selectionMode) {
       clearActions();
       buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedTasks();}});
@@ -164,10 +158,4 @@ public void setSelectionMode(boolean selectionMode) {
       item.setSelectionMode(selectionMode);
     }
   }
-  public void changeSelectionNumber(int i) {
-    changeSelectionNumber = changeSelectionNumber + i;
-    if (changeSelectionNumber == 0) {
-      setSelectionMode(false);
-    }
-  }
 }
\ No newline at end of file
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 288dfc44f..06add7133 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,24 +25,24 @@
 package org.silverpeas.mobile.client.apps.tasks.pages.widgets;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.Scheduler;
 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.*;
+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.pages.TasksPage;
 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);
 
@@ -54,10 +54,6 @@ public class TaskItem extends Composite {
   @UiField(provided = true) protected TasksMessages msg = null;
 
   private TaskDTO task;
-
-  private TasksPage parent;
-
-  private boolean selectionMode = false;
   interface ContactItemUiBinder extends UiBinder<Widget, TaskItem> {
   }
 
@@ -86,26 +82,13 @@ public void setData(TaskDTO data) {
     range.setDisabled(true);
     updateRange(data.getPercentCompleted());
   }
-
-  public void setParent(TasksPage page) {
-    this.parent = page;
-  }
   public TaskDTO getData() {
     return task;
   }
 
   @UiHandler("link")
   protected void startTouch(TouchStartEvent event) {
-    if (!parent.isSelectionMode()) {
-      Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
-        @Override
-        public boolean execute() {
-          selectionMode = true;
-          container.getElement().addClassName("selected");
-          return false;
-        }
-      }, 400);
-    }
+    startTouch(event, container);
   }
 
   public boolean isSelected() {
@@ -114,42 +97,19 @@ public boolean isSelected() {
 
   @UiHandler("link")
   protected void endTouch(TouchEndEvent event) {
-    if (parent.isSelectionMode()) {
-      if (container.getElement().hasClassName("selected")) {
-        container.getElement().removeClassName("selected");
-        parent.changeSelectionNumber(-1);
-      } else {
-        container.getElement().addClassName("selected");
-        parent.changeSelectionNumber(1);
-      }
-    } else {
-      if (selectionMode) {
-        container.getElement().addClassName("selected");
-        parent.changeSelectionNumber(1);
-        parent.setSelectionMode(true);
-      } else {
+    endTouch(event, container, new Command() {
+      @Override
+      public void execute() {
         if (task.getExternalId().isEmpty()) {
           TaskPage page = new TaskPage();
           page.setPageTitle(msg.edit());
           page.setData(task);
           page.show();
-          Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
-            @Override
-            public boolean execute() {
-              selectionMode = false;
-              container.getElement().removeClassName("selected");
-              return false;
-            }
-          }, 400);
         } else {
           //TODO : redirect on content
         }
       }
-    }
-  }
-
-  public void setSelectionMode(boolean mode) {
-    this.selectionMode = mode;
+    });
   }
 
   private void updateRange(final int value) {
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 7b1e3c994..393038ea7 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
@@ -56,12 +56,16 @@ public abstract class PageContent extends Composite implements View, NativePrevi
 
   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();
     pageTitle = ResourcesManager.getLabel("mainpage.title");
@@ -203,4 +207,18 @@ public void loadedDataEvent(final DataLoadedEvent dataLoadedEvent) {
   public void loadedMoreDataEvent(final MoreDataLoadedEvent moreDataLoadedEvent) {
     // to be override if necessary
   }
+
+  public boolean isSelectionMode() {
+    return selectionMode;
+  }
+  public void setSelectionMode(boolean selectionMode) {
+    this.selectionMode = selectionMode;
+  }
+
+  public void changeSelectionNumber(int i) {
+    changeSelectionNumber = changeSelectionNumber + i;
+    if (changeSelectionNumber == 0) {
+      setSelectionMode(false);
+    }
+  }
 }
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..b5643dc4f
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SelectableItem.java
@@ -0,0 +1,66 @@
+package org.silverpeas.mobile.client.components.base.widgets;
+
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.event.dom.client.TouchEndEvent;
+import com.google.gwt.event.dom.client.TouchStartEvent;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HTMLPanel;
+import org.silverpeas.mobile.client.apps.tasks.pages.TaskPage;
+import org.silverpeas.mobile.client.components.base.PageContent;
+
+public class SelectableItem extends Composite {
+
+    private PageContent parent;
+    private boolean selectionMode = false;
+
+    public void setParent(PageContent page) {
+        this.parent = page;
+    }
+
+    public void setSelectionMode(boolean mode) {
+        this.selectionMode = mode;
+    }
+
+    protected void startTouch(TouchStartEvent event, HTMLPanel container) {
+        if (!parent.isSelectionMode()) {
+            Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
+                @Override
+                public boolean execute() {
+                    selectionMode = true;
+                    container.getElement().addClassName("selected");
+                    return false;
+                }
+            }, 400);
+        }
+    }
+
+    protected void endTouch(TouchEndEvent event, HTMLPanel container, Command onClickAction) {
+        if (parent.isSelectionMode()) {
+            if (container.getElement().hasClassName("selected")) {
+                container.getElement().removeClassName("selected");
+                parent.changeSelectionNumber(-1);
+            } else {
+                container.getElement().addClassName("selected");
+                parent.changeSelectionNumber(1);
+            }
+        } else {
+            if (selectionMode) {
+                container.getElement().addClassName("selected");
+                parent.changeSelectionNumber(1);
+                parent.setSelectionMode(true);
+            } else {
+                onClickAction.execute();
+                Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
+                    @Override
+                    public boolean execute() {
+                        selectionMode = false;
+                        container.getElement().removeClassName("selected");
+                        return false;
+                    }
+                }, 400);
+            }
+        }
+    }
+
+}

From 69a274e619b3c9a53dd6c388ab754a75dd275c15 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 12 Feb 2024 18:19:32 +0100
Subject: [PATCH 181/228] Feature #13988 : only personals tasks

---
 .../client/apps/tasks/pages/widgets/TaskItem.java      |  4 ++--
 .../client/components/base/widgets/SelectableItem.java | 10 +++++++---
 2 files changed, 9 insertions(+), 5 deletions(-)

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 06add7133..b26c4aacb 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
@@ -88,7 +88,7 @@ public TaskDTO getData() {
 
   @UiHandler("link")
   protected void startTouch(TouchStartEvent event) {
-    startTouch(event, container);
+    startTouch(event, container, task.getExternalId().isEmpty());
   }
 
   public boolean isSelected() {
@@ -97,7 +97,7 @@ public boolean isSelected() {
 
   @UiHandler("link")
   protected void endTouch(TouchEndEvent event) {
-    endTouch(event, container, new Command() {
+    endTouch(event, container, task.getExternalId().isEmpty(), new Command() {
       @Override
       public void execute() {
         if (task.getExternalId().isEmpty()) {
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
index b5643dc4f..84033b02d 100644
--- 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
@@ -22,8 +22,8 @@ public void setSelectionMode(boolean mode) {
         this.selectionMode = mode;
     }
 
-    protected void startTouch(TouchStartEvent event, HTMLPanel container) {
-        if (!parent.isSelectionMode()) {
+    protected void startTouch(TouchStartEvent event, HTMLPanel container, boolean selectable) {
+        if (!parent.isSelectionMode() && selectable) {
             Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
                 @Override
                 public boolean execute() {
@@ -35,7 +35,11 @@ public boolean execute() {
         }
     }
 
-    protected void endTouch(TouchEndEvent event, HTMLPanel container, Command onClickAction) {
+    protected void endTouch(TouchEndEvent event, HTMLPanel container, boolean selectable, Command onClickAction) {
+        if (!selectable) {
+            onClickAction.execute();
+            return;
+        }
         if (parent.isSelectionMode()) {
             if (container.getElement().hasClassName("selected")) {
                 container.getElement().removeClassName("selected");

From 773a862313e9ecefb03f41a5c8d72bfb3f1327cf Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 12 Feb 2024 18:49:46 +0100
Subject: [PATCH 182/228] Fix Bug #13987

---
 .../client/components/base/NavigationMenu.java | 13 ++++++++-----
 .../shared/helpers/ApplicationsHelper.java     | 18 ++++++++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/shared/helpers/ApplicationsHelper.java

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 6bb16910f..622633fa7 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
@@ -71,6 +71,7 @@
 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;
 
@@ -127,12 +128,14 @@ public NavigationMenu() {
   public void setPersonalApps(List<ApplicationInstanceDTO> applicationInstanceDTOS) {
     listApplications.clear();
     for (ApplicationInstanceDTO app : applicationInstanceDTOS) {
-      if (app.getType().equals(Apps.kmelia.name())) {
-        app.setLabel(msg.myDocuments());
+      if (ApplicationsHelper.isSupportedApp(app)) {
+        if (app.getType().equals(Apps.kmelia.name())) {
+          app.setLabel(msg.myDocuments());
+        }
+        NavigationItem item = new NavigationItem();
+        item.setData(app);
+        listApplications.add(item);
       }
-      NavigationItem item = new NavigationItem();
-      item.setData(app);
-      listApplications.add(item);
     }
     personalAppsInitialized = true;
   }
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;
+    }
+
+}

From e87fc8ba3dadc12f1474f120b27fbec3745f791d Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 12 Feb 2024 19:07:41 +0100
Subject: [PATCH 183/228] improve icons navigation

---
 .../mobile/client/apps/documents/pages/widgets/GedItem.java   | 4 +++-
 .../client/apps/navigation/pages/widgets/NavigationItem.java  | 3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

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 f66332b33..57cee45f2 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
@@ -72,6 +72,7 @@ public void setData(Object data) {
         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());
@@ -82,8 +83,9 @@ public void setData(Object data) {
         style += ");background-position:5px 5px;background-size:20px 20px;";
         link.getElement().setAttribute("style", style);
       }
+      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.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/NavigationItem.java
index 2f20ad283..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
@@ -67,6 +67,7 @@ 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())) {
@@ -112,8 +113,8 @@ public void setData(SilverpeasObjectDTO data) {
         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")

From abf895e918d15c485d38672fbdb244592ce181a6 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 12 Feb 2024 19:23:05 +0100
Subject: [PATCH 184/228] Refactoring

---
 .../client/apps/tasks/pages/widgets/TaskItem.java   |  9 +++------
 .../components/base/widgets/SelectableItem.java     | 13 +++++++++++--
 .../java/org/silverpeas/mobile/public/spmobile.css  |  2 +-
 3 files changed, 15 insertions(+), 9 deletions(-)

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 b26c4aacb..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
@@ -60,6 +60,7 @@ interface ContactItemUiBinder extends UiBinder<Widget, TaskItem> {
   public TaskItem() {
     msg = GWT.create(TasksMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
+    setContainer(container);
   }
 
   public void setData(TaskDTO data) {
@@ -88,16 +89,12 @@ public TaskDTO getData() {
 
   @UiHandler("link")
   protected void startTouch(TouchStartEvent event) {
-    startTouch(event, container, task.getExternalId().isEmpty());
-  }
-
-  public boolean isSelected() {
-    return container.getElement().hasClassName("selected");
+    startTouch(event, task.getExternalId().isEmpty());
   }
 
   @UiHandler("link")
   protected void endTouch(TouchEndEvent event) {
-    endTouch(event, container, task.getExternalId().isEmpty(), new Command() {
+    endTouch(event, task.getExternalId().isEmpty(), new Command() {
       @Override
       public void execute() {
         if (task.getExternalId().isEmpty()) {
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
index 84033b02d..80afeb6b2 100644
--- 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
@@ -12,17 +12,26 @@
 public class SelectableItem extends Composite {
 
     private PageContent parent;
+    private HTMLPanel container;
     private boolean selectionMode = false;
 
     public void setParent(PageContent page) {
         this.parent = page;
     }
 
+    public void setContainer(HTMLPanel container) {
+        this.container = container;
+    }
+
     public void setSelectionMode(boolean mode) {
         this.selectionMode = mode;
     }
 
-    protected void startTouch(TouchStartEvent event, HTMLPanel container, boolean selectable) {
+    public boolean isSelected() {
+        return container.getElement().hasClassName("selected");
+    }
+
+    protected void startTouch(TouchStartEvent event, boolean selectable) {
         if (!parent.isSelectionMode() && selectable) {
             Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
                 @Override
@@ -35,7 +44,7 @@ public boolean execute() {
         }
     }
 
-    protected void endTouch(TouchEndEvent event, HTMLPanel container, boolean selectable, Command onClickAction) {
+    protected void endTouch(TouchEndEvent event, boolean selectable, Command onClickAction) {
         if (!selectable) {
             onClickAction.execute();
             return;
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 f6663b3d2..f51d710d3 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
@@ -726,7 +726,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 #personals-apps a {
   border: none;
-  padding-left: 2em;
+  padding-left: 0.5em;
   padding-top: 0.5em;
 }
 

From c2832af859b9d60575c9c59c97f0a2f10b5a69cb Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 12 Feb 2024 19:25:18 +0100
Subject: [PATCH 185/228] refactoring

---
 .../apps/tasks/pages/widgets/AddTaskItem.java | 62 -------------------
 .../tasks/pages/widgets/AddTaskItem.ui.xml    | 32 ----------
 2 files changed, 94 deletions(-)
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.java
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.ui.xml

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/apps/tasks/pages/widgets/AddTaskItem.java
deleted file mode 100644
index b13e6e846..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.pages.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.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;
-
-/**
- * @author: svu
- */
-public class AddTaskItem  extends Composite {
-
-  interface AddTaskItemUiBinder extends UiBinder<Widget, AddTaskItem> {
-  }
-
-  @UiField Anchor link;
-  @UiField(provided = true) protected TasksMessages msg = null;
-
-  private static AddTaskItemUiBinder uiBinder = GWT.create(AddTaskItemUiBinder.class);
-
-  public AddTaskItem() {
-    msg = GWT.create(TasksMessages.class);
-    initWidget(uiBinder.createAndBindUi(this));
-  }
-
-  @UiHandler("link")
-  void createTask(ClickEvent event) {
-    TaskPage page = new TaskPage();
-    page.setPageTitle(msg.create());
-    page.show();
-  }
-}
\ No newline at end of file
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/tasks/pages/widgets/AddTaskItem.ui.xml
deleted file mode 100644
index c9f8f3a0b..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskItem.ui.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ 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.apps.tasks.resources.TasksMessages'/>
-
-  <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

From cb83e5d1538f15896a9956cc9fd7c140791f0e4e Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 13 Feb 2024 11:23:00 +0100
Subject: [PATCH 186/228] Fix burger menu display actions

---
 .../silverpeas/mobile/client/components/base/NavigationMenu.java | 1 -
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css      | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

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 622633fa7..f8b650d5b 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
@@ -105,7 +105,6 @@ public NavigationMenu() {
     initWidget(uiBinder.createAndBindUi(this));
     container.getElement().setId("silverpeas-navmenu-panel");
     listApplications.getElement().setId("personals-apps");
-    container.getElement().getStyle().setHeight(Window.getClientHeight(), Unit.PX);
     user.getElement().setId("user");
     String url = ResourcesManager.getParam("help.url");
     if (url != null && !url.isEmpty()) {
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 f51d710d3..971a78720 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
@@ -653,6 +653,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 {

From 345d1de13b40b7d8cb4588c4bfe72326ace81b51 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 13 Feb 2024 19:43:26 +0100
Subject: [PATCH 187/228] New selection design for notification box

---
 .../notificationsbox/NotificationsBoxApp.java |  3 +-
 .../pages/NotificationsBoxPage.java           | 70 ++++++++++++++---
 .../pages/widgets/DeleteButton.java           | 15 +---
 .../pages/widgets/DeleteButton.ui.xml         |  4 +-
 .../pages/widgets/MarkAsReadButton.java       | 13 +---
 .../pages/widgets/MarkAsReadButton.ui.xml     |  4 +-
 .../pages/widgets/NotificationItem.java       | 76 ++++++++++---------
 .../pages/widgets/NotificationItem.ui.xml     | 11 +--
 .../resources/NotificationsMessages.java      |  2 +
 .../NotificationsMessages.properties          |  2 +
 .../NotificationsMessages_en.properties       |  4 +-
 .../NotificationsMessages_fr.properties       |  4 +-
 .../base/widgets/SelectableItem.java          |  1 +
 .../mobile/public/icons/mark_read.svg         |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 61 ++++++++++++---
 .../services/AbstractRestWebService.java      | 46 +++++++----
 .../server/services/ServiceNotifications.java |  6 +-
 .../dto/notifications/NotificationBoxDTO.java |  9 +++
 .../NotificationReceivedDTO.java              |  1 +
 .../notifications/NotificationSendedDTO.java  |  1 +
 20 files changed, 226 insertions(+), 108 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/mark_read.svg

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 e92c5b261..2ab965cae 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,8 +29,12 @@
 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.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;
@@ -40,7 +44,9 @@
 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.PageContent;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
@@ -62,9 +68,9 @@ public class NotificationsBoxPage extends PageContent implements NotificationsBo
   @UiField
   Anchor notificationReceived, notificationSended;
 
-
-  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> {
   }
@@ -75,10 +81,8 @@ public NotificationsBoxPage() {
     initWidget(uiBinder.createAndBindUi(this));
     EventBus.getInstance().addHandler(AbstractNotificationsBoxPagesEvent.TYPE, this);
     EventBus.getInstance().fireEvent(new NotificationsLoadEvent());
-    delete.setParentPage(this);
-    notRead.setParentPage(this);
-    addActionMenu(delete);
-    addActionMenu(notRead);
+    buttonDelete.setParentPage(this);
+    buttonNotRead.setParentPage(this);
   }
 
   @Override
@@ -96,6 +100,7 @@ public void onNotificationsLoaded(final NotificationsLoadedEvent event) {
     for (NotificationReceivedDTO notif : notifs) {
       NotificationItem item = new NotificationItem();
       item.setData(notif);
+      item.setParent(this);
       notifications.add(item);
     }
   }
@@ -110,6 +115,7 @@ public void onNotificationsSendedLoaded(
     for (NotificationSendedDTO notif : notifs) {
       NotificationItem item = new NotificationItem();
       item.setData(notif);
+      item.setParent(this);
       notifications.add(item);
     }
   }
@@ -127,19 +133,61 @@ 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();
+    }
+    for (int i = 0; i < notifications.getCount(); i++) {
+      NotificationItem item = (NotificationItem) notifications.getWidget(i);
+      item.setSelectionMode(selectionMode);
+    }
+  }
+
+  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/widgets/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.java
index ee509d84c..4ec466bdf 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/apps/notificationsbox/pages/widgets/DeleteButton.java
@@ -55,7 +55,7 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
   @UiField
   HTMLPanel container;
   @UiField
-  Anchor delete;
+  Anchor link;
 
   @UiField(provided = true)
   protected NotificationsMessages msg = null;
@@ -64,19 +64,12 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
   public DeleteButton() {
     msg = GWT.create(NotificationsMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
-    setId("delete");
+    setId("delete-notification");
   }
 
-  @UiHandler("delete")
+  @UiHandler("link")
   void delete(ClickEvent event) {
-    List<NotificationBoxDTO> selection = parentPage.getSelectedNotification();
-
-    DeleteNotificationsEvent deleteEvent = new DeleteNotificationsEvent();
-    deleteEvent.setSelection(selection);
-    if (!selection.isEmpty()) EventBus.getInstance().fireEvent(deleteEvent);
-
-    // hide menu
-    ActionsMenu.close(getElement());
+    getCallback().execute();
   }
 
   public void setParentPage(final NotificationsBoxPage parentPage) {
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/apps/notificationsbox/pages/widgets/DeleteButton.ui.xml
index 72d0b4821..4cd11cd25 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/apps/notificationsbox/pages/widgets/DeleteButton.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="delete" text="{msg.delete}"/>
+    <g:HTMLPanel tag="li" ui:field="container" styleName="delete-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/MarkAsReadButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/MarkAsReadButton.java
index 1508dd38c..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
@@ -55,7 +55,7 @@ interface NotReadButtonUiBinder extends UiBinder<HTMLPanel, MarkAsReadButton> {}
   @UiField
   HTMLPanel container;
   @UiField
-  Anchor read;
+  Anchor link;
 
   @UiField(provided = true)
   protected NotificationsMessages msg = null;
@@ -67,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
-    ActionsMenu.close(getElement());
+    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..e361f954c 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,86 @@
 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.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);
   }
 
-  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.setInnerText(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.setInnerText(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/components/base/widgets/SelectableItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SelectableItem.java
index 80afeb6b2..681f9117c 100644
--- 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
@@ -4,6 +4,7 @@
 import com.google.gwt.event.dom.client.TouchEndEvent;
 import com.google.gwt.event.dom.client.TouchStartEvent;
 import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HTMLPanel;
 import org.silverpeas.mobile.client.apps.tasks.pages.TaskPage;
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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 971a78720..e6a8ec2e9 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
@@ -804,6 +804,15 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 2.5em;
 }
 
+#actionList-bloc > li {
+  display: inline-block;
+  padding-left: 0.5em;
+}
+
+#actionList-bloc > li:last-child {
+  padding-left: 0em;
+}
+
 #actionsList:has(.add-task),  #actionsList:has(.delete-task){
   right: 1em;
 }
@@ -1464,7 +1473,8 @@ li > #operations {
   width: 2em;
 }
 
-#notification .list-notifications > li.selected, .list-resources > li.selected, #tasks > li.selected {
+#notification .list-notifications > li.selected, .list-resources > li.selected, #tasks > li.selected,
+.notifications > li.selected {
   border-left: 8px solid #7eb73a;
   color: #000
 }
@@ -2744,35 +2754,42 @@ a.popin-btn {
 }
 
 /********* notification **************/
-.notificationBox .ui-listview.notifications  .notification-date {
-	color:#777;
-	display:inline-block;
-	font-size:90%;
-}
 .notificationBox .ui-listview.notifications  input {
 	position:absolute;
 	top:0.5em;
 	left:0.25em;
 }
 
+.notificationBox .ui-listview.notifications a {
+    background-color: transparent;
+    user-select: none;
+}
 
-.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;
 }
 .notificationBox .ui-listview.notifications  .notification-source {
 	font-size:90%;
+    color: #70a72e;
 }
 
-.notificationBox .ui-listview.notifications  .notification-title{
+.notificationBox .ui-listview.notifications .notification-title{
 	margin-bottom:0.75em;
-	font-weight:600;
+    color: #000;
+}
+
+.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;
 }
@@ -2789,6 +2806,30 @@ a.popin-btn {
 	background-color: #FFF;
 }
 
+#actionsList:has(.delete-notification) {
+  right: 1em;
+}
+
+.delete-notification {
+  height: 24px;
+  width: 24px;
+  filter: invert(1);
+  background: url('icons/delete.svg') no-repeat;
+}
+
+.markAsRead-notification {
+  height: 24px;
+  width: 24px;
+  filter: invert(1);
+  background: url('icons/mark_read.svg') no-repeat;
+}
+
+.delete-notification a, .markAsRead-notification a {
+  height: 24px;
+  width: 24px;
+  display: block;
+}
+
 /******** FAQ ********/
 .faq-categories {
   width: 90vw;
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 fb02aa517..26a29000b 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
@@ -2,6 +2,7 @@
 
 import org.silverpeas.core.SilverpeasException;
 import org.silverpeas.core.security.authentication.AuthenticationCredential;
+import org.silverpeas.core.security.authentication.AuthenticationResponse;
 import org.silverpeas.core.security.authentication.AuthenticationService;
 import org.silverpeas.core.security.authentication.AuthenticationServiceProvider;
 import org.silverpeas.core.security.session.SessionInfo;
@@ -16,7 +17,6 @@
 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;
@@ -33,7 +33,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);
   }
@@ -42,8 +42,16 @@ protected void setMainsessioncontroller(String login, String password, String do
       throws SilverpeasException {
     AuthenticationService authService = AuthenticationServiceProvider.getService();
     AuthenticationCredential credential = AuthenticationCredential.newWithAsLogin(login);
-    String key =
+    AuthenticationResponse response =
         authService.authenticate(credential.withAsPassword(password).withAsDomainId(domainId));
+    String key;
+    if (response == null) {
+      key = null;
+    } else if (response.getStatus().succeeded()) {
+      key = response.getToken();
+    } else {
+      key = response.getStatus().getCode();
+    }
     MainSessionController mainSessionController =
         new MainSessionController(key, getHttpRequest().getSession());
   }
@@ -75,7 +83,8 @@ protected void initSilverpeasSession(HttpServletRequest request) {
     }
   }
 
-  protected StreamingList createStreamingList(CommandCreateList command, int callNumber, int callSize, String cacheKey) throws Exception {
+  protected StreamingList createStreamingList(CommandCreateList command, int callNumber,
+      int callSize, String cacheKey) throws Exception {
     List list;
     if (callNumber == 0) {
       list = command.execute();
@@ -87,25 +96,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;
@@ -120,9 +135,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/ServiceNotifications.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java
index 30e8ee7b1..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
@@ -117,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());
@@ -362,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(String.valueOf(dto.getIdNotif()), Integer.parseInt(getUser().getId()));
+          SentNotificationInterface.get().deleteNotif(getUser().getId(), (int) dto.getIdNotif());
         } catch (NotificationException e) {
           SilverLogger.getLogger(this).error(e);
         }
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/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() {

From 97e2ee95fcca56dd684ad1b75426790bcefa7119 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 13 Feb 2024 21:43:52 +0100
Subject: [PATCH 188/228] Fix multi touch selection

---
 .../pages/widgets/NotificationItem.java       |  6 ++
 .../base/widgets/SelectableItem.java          | 70 ++++++++++---------
 .../org/silverpeas/mobile/public/spmobile.css |  1 -
 3 files changed, 43 insertions(+), 34 deletions(-)

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 e361f954c..cf9de3739 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
@@ -27,6 +27,7 @@
 import com.google.gwt.core.client.GWT;
 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;
@@ -74,6 +75,11 @@ protected void startTouch(TouchStartEvent event) {
     startTouch(event, true);
   }
 
+  @UiHandler("link")
+  protected void moveTouch(TouchMoveEvent event) {
+    super.moveTouch(event);
+  }
+
   @UiHandler("link")
   protected void endTouch(TouchEndEvent event) {
     endTouch(event, true, new Command() {
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
index 681f9117c..36dfd88bf 100644
--- 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
@@ -1,13 +1,12 @@
 package org.silverpeas.mobile.client.components.base.widgets;
 
-import com.google.gwt.core.client.Scheduler;
 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.Window;
+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.apps.tasks.pages.TaskPage;
+import com.google.gwt.user.client.u i.HTMLPanel;
 import org.silverpeas.mobile.client.components.base.PageContent;
 
 public class SelectableItem extends Composite {
@@ -15,6 +14,9 @@ public class SelectableItem extends Composite {
     private PageContent parent;
     private HTMLPanel container;
     private boolean selectionMode = false;
+    private boolean onMove = false;
+
+    private Timer timer = null;
 
     public void setParent(PageContent page) {
         this.parent = page;
@@ -34,46 +36,48 @@ public boolean isSelected() {
 
     protected void startTouch(TouchStartEvent event, boolean selectable) {
         if (!parent.isSelectionMode() && selectable) {
-            Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
+            timer = new Timer() {
                 @Override
-                public boolean execute() {
+                public void run() {
                     selectionMode = true;
                     container.getElement().addClassName("selected");
-                    return false;
                 }
-            }, 400);
+            };
+            timer.schedule(400);
         }
     }
 
+    protected void moveTouch(TouchMoveEvent event) {
+        if (timer != null) timer.cancel();
+        onMove = true;
+    }
+
     protected void endTouch(TouchEndEvent event, boolean selectable, Command onClickAction) {
-        if (!selectable) {
-            onClickAction.execute();
-            return;
-        }
-        if (parent.isSelectionMode()) {
-            if (container.getElement().hasClassName("selected")) {
-                container.getElement().removeClassName("selected");
-                parent.changeSelectionNumber(-1);
-            } else {
-                container.getElement().addClassName("selected");
-                parent.changeSelectionNumber(1);
+        if (!onMove) {
+            if (!selectable) {
+                onClickAction.execute();
+                return;
             }
-        } else {
-            if (selectionMode) {
-                container.getElement().addClassName("selected");
-                parent.changeSelectionNumber(1);
-                parent.setSelectionMode(true);
+            if (parent.isSelectionMode()) {
+                if (container.getElement().hasClassName("selected")) {
+                    container.getElement().removeClassName("selected");
+                    parent.changeSelectionNumber(-1);
+                } else {
+                    container.getElement().addClassName("selected");
+                    parent.changeSelectionNumber(1);
+                }
             } else {
-                onClickAction.execute();
-                Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
-                    @Override
-                    public boolean execute() {
-                        selectionMode = false;
-                        container.getElement().removeClassName("selected");
-                        return false;
-                    }
-                }, 400);
+                if (selectionMode) {
+                    container.getElement().addClassName("selected");
+                    parent.changeSelectionNumber(1);
+                    parent.setSelectionMode(true);
+                } else {
+                    onClickAction.execute();
+                    if (timer != null) timer.cancel();
+                }
             }
+        } else {
+            onMove = false;
         }
     }
 
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 e6a8ec2e9..b172b060b 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
@@ -2762,7 +2762,6 @@ a.popin-btn {
 
 .notificationBox .ui-listview.notifications a {
     background-color: transparent;
-    user-select: none;
 }
 
 .notificationBox .ui-listview.notifications  .notification-date,

From f714f541cc95ca3a933444c34f7aaa710208a05d Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 14 Feb 2024 11:34:50 +0100
Subject: [PATCH 189/228] Fix multi selection

---
 .../pages/NotificationsBoxPage.java           |  5 --
 .../client/apps/tasks/pages/TasksPage.java    |  4 --
 .../client/components/base/PageContent.java   |  5 ++
 .../base/widgets/SelectableItem.java          | 65 ++++++++++---------
 .../org/silverpeas/mobile/public/spmobile.css |  3 +
 .../webapp/WEB-INF/manifest.json.template     |  2 +-
 6 files changed, 44 insertions(+), 40 deletions(-)

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 2ab965cae..7e0063f60 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
@@ -30,7 +30,6 @@
 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.Widget;
 import org.silverpeas.mobile.client.apps.notificationsbox.events.app.DeleteNotificationsEvent;
@@ -162,10 +161,6 @@ public void setSelectionMode(boolean selectionMode) {
     } else {
       clearActions();
     }
-    for (int i = 0; i < notifications.getCount(); i++) {
-      NotificationItem item = (NotificationItem) notifications.getWidget(i);
-      item.setSelectionMode(selectionMode);
-    }
   }
 
   private void markAsReadNotifications() {
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 1a67df1a8..67d17709e 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
@@ -153,9 +153,5 @@ public void setSelectionMode(boolean selectionMode) {
       clearActions();
       addActionShortcut(buttonCreate);
     }
-    for (int i = 0; i < list.getCount(); i++) {
-      TaskItem item = (TaskItem) list.getWidget(i);
-      item.setSelectionMode(selectionMode);
-    }
   }
 }
\ No newline at end of file
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 393038ea7..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
@@ -213,6 +213,7 @@ public boolean isSelectionMode() {
   }
   public void setSelectionMode(boolean selectionMode) {
     this.selectionMode = selectionMode;
+    resetSelectionNumber();
   }
 
   public void changeSelectionNumber(int i) {
@@ -221,4 +222,8 @@ public void changeSelectionNumber(int i) {
       setSelectionMode(false);
     }
   }
+
+  private void resetSelectionNumber() {
+    changeSelectionNumber = 0;
+  }
 }
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
index 36dfd88bf..c8a6a6579 100644
--- 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
@@ -6,17 +6,18 @@
 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.u i.HTMLPanel;
+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 selectionMode = false;
     private boolean onMove = false;
+    private boolean unSelected = false;
 
-    private Timer timer = null;
+    private Timer timerSelection = null;
+    private Timer timerScroll = null;
 
     public void setParent(PageContent page) {
         this.parent = page;
@@ -26,59 +27,63 @@ public void setContainer(HTMLPanel container) {
         this.container = container;
     }
 
-    public void setSelectionMode(boolean mode) {
-        this.selectionMode = mode;
-    }
-
     public boolean isSelected() {
         return container.getElement().hasClassName("selected");
     }
 
     protected void startTouch(TouchStartEvent event, boolean selectable) {
         if (!parent.isSelectionMode() && selectable) {
-            timer = new Timer() {
+            timerSelection = new Timer() {
                 @Override
                 public void run() {
-                    selectionMode = true;
+                    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;
+                    }
                 }
             };
-            timer.schedule(400);
+            timerScroll.schedule(100);
         }
     }
 
     protected void moveTouch(TouchMoveEvent event) {
-        if (timer != null) timer.cancel();
+        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) {
-                onClickAction.execute();
-                return;
-            }
-            if (parent.isSelectionMode()) {
-                if (container.getElement().hasClassName("selected")) {
-                    container.getElement().removeClassName("selected");
-                    parent.changeSelectionNumber(-1);
-                } else {
-                    container.getElement().addClassName("selected");
-                    parent.changeSelectionNumber(1);
-                }
-            } else {
-                if (selectionMode) {
-                    container.getElement().addClassName("selected");
-                    parent.changeSelectionNumber(1);
-                    parent.setSelectionMode(true);
-                } else {
+            if (selectable) {
+                if (!parent.isSelectionMode() && !unSelected) {
                     onClickAction.execute();
-                    if (timer != null) timer.cancel();
                 }
+            } else {
+                onClickAction.execute();
             }
         } else {
             onMove = false;
         }
+        unSelected = false;
     }
 
 }
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 b172b060b..04349f993 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
@@ -2769,15 +2769,18 @@ a.popin-btn {
 	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{
 	margin-bottom:0.75em;
     color: #000;
+    user-select: none;
 }
 
 .notificationBox .notification.not-read a .notification-title {
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 e48086034..6abde7196 100644
--- a/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
+++ b/mobile-war/src/main/webapp/WEB-INF/manifest.json.template
@@ -9,7 +9,7 @@
   "start_url": "/silverpeas/spmobile/spmobil.jsp",
   "display": "standalone",
   "display_override": ["standalone", "minimal-ui"],
-  "theme_color": "#00FF00",
+  "theme_color": "#7eb73b",
   "icons": [
     {
       "src" : "icon.png",

From 1535f134a3a5bc155b2a08c40c2f18207fe842ec Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 14 Feb 2024 18:12:07 +0100
Subject: [PATCH 190/228] enhance sharebox

---
 .../apps/sharesbox/pages/SharesBoxPage.java   | 36 ++++++++-
 .../apps/sharesbox/pages/SharesBoxPage.ui.xml |  4 +-
 .../sharesbox/pages/widgets/DeleteButton.java | 27 +------
 .../pages/widgets/DeleteButton.ui.xml         |  5 +-
 .../sharesbox/pages/widgets/ShareItem.java    | 63 +++++++++++-----
 .../sharesbox/pages/widgets/ShareItem.ui.xml  | 11 +--
 .../sharesbox/resources/ShareMessages.java    |  1 +
 .../resources/ShareMessages.properties        |  1 +
 .../resources/ShareMessages_en.properties     |  3 +-
 .../resources/ShareMessages_fr.properties     |  3 +-
 .../silverpeas/mobile/public/icons/link.svg   |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 74 +++++++++++++++++--
 12 files changed, 165 insertions(+), 64 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/link.svg

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 c23567afb..cc7b6a7fc 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,7 +27,9 @@
 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;
@@ -35,6 +37,7 @@
 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.PageContent;
 import org.silverpeas.mobile.shared.dto.tickets.TicketDTO;
@@ -52,13 +55,14 @@ public class SharesBoxPage extends PageContent implements SharesBoxPagesEventHan
   UnorderedList shares;
   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);
     }
   }
@@ -94,10 +98,34 @@ 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);
-    addActionMenu(delete);
+  }
+
+  @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 5bb8c953e..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,8 +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">
+  <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/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.java
index 517ceea35..24c593333 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/apps/sharesbox/pages/widgets/DeleteButton.java
@@ -31,15 +31,8 @@
 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.client.components.base.ActionsMenu;
-import org.silverpeas.mobile.shared.dto.tickets.TicketDTO;
-
-import java.util.List;
 
 /**
  * @author: svu
@@ -50,12 +43,10 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
 
   private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class);
 
-  private SharesBoxPage parentPage;
-
   @UiField
   HTMLPanel container;
   @UiField
-  Anchor delete;
+  Anchor link;
 
   @UiField(provided = true)
   protected ShareMessages msg = null;
@@ -64,21 +55,11 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
   public DeleteButton() {
     msg = GWT.create(ShareMessages.class);
     initWidget(uiBinder.createAndBindUi(this));
-    setId("delete");
+    setId("delete-share");
   }
 
-  @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
-    ActionsMenu.close(getElement());
-  }
-
-  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/sharesbox/pages/widgets/DeleteButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.ui.xml
index 472786168..0c882f21f 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/apps/sharesbox/pages/widgets/DeleteButton.ui.xml
@@ -27,7 +27,8 @@
 
     <ui:with field='msg' type='org.silverpeas.mobile.client.apps.sharesbox.resources.ShareMessages'/>
 
-    <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-share">
+        <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/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/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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 04349f993..7d075e3b0 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
@@ -480,7 +480,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   color: #fff;
   font-size: 1.1em;
   font-weight: normal;
-  left: 60px;
+  left: 50px;
   line-height: 44px;
   margin: 0;
   overflow: hidden;
@@ -488,6 +488,10 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   position: absolute;
   top: 1px;
   height: 44px;
+  width: calc(100vw - 50px - 2.5em);
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
 }
 
 .ui-btn-right.back {
@@ -813,7 +817,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 0em;
 }
 
-#actionsList:has(.add-task),  #actionsList:has(.delete-task){
+#actionsList:has(.add-task),  #actionsList:has(.delete-task), #actionsList:has(.delete-share) {
   right: 1em;
 }
 
@@ -1422,6 +1426,7 @@ li > #operations {
   margin-bottom: 2em;
 }
 
+
 /* notification */
 
 #notification .list-contacts li {
@@ -1474,7 +1479,7 @@ li > #operations {
 }
 
 #notification .list-notifications > li.selected, .list-resources > li.selected, #tasks > li.selected,
-.notifications > li.selected {
+.notifications > li.selected, .shares > li.selected {
   border-left: 8px solid #7eb73a;
   color: #000
 }
@@ -2753,6 +2758,63 @@ a.popin-btn {
   padding:1em;
 }
 
+/********* 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;
+}
+
+/*.sharesBox .ui-listview.shares .notification-title{
+  margin-bottom:0.75em;
+  color: #000;
+  user-select: none;
+}*/
+
+.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;
+}
+
 /********* notification **************/
 .notificationBox .ui-listview.notifications  input {
 	position:absolute;
@@ -2796,7 +2858,7 @@ a.popin-btn {
 	border-bottom:1px solid  #CCC;
 }
 
-.ui-listview.notifications li:first-child{
+.ui-listview.notifications li:first-child {
 	border-top:1px solid  #CCC;
 }
 
@@ -2812,7 +2874,7 @@ a.popin-btn {
   right: 1em;
 }
 
-.delete-notification {
+.delete-notification, .delete-share a {
   height: 24px;
   width: 24px;
   filter: invert(1);
@@ -2826,7 +2888,7 @@ a.popin-btn {
   background: url('icons/mark_read.svg') no-repeat;
 }
 
-.delete-notification a, .markAsRead-notification a {
+.delete-notification a, .markAsRead-notification a, .delete-share a {
   height: 24px;
   width: 24px;
   display: block;

From 36897f722d1ceea80c0975cc47c58f4b918361d8 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 15 Feb 2024 11:51:15 +0100
Subject: [PATCH 191/228] html in notification title

---
 .../apps/notificationsbox/pages/widgets/NotificationItem.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

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 cf9de3739..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
@@ -100,7 +100,7 @@ public void setData(NotificationSendedDTO data) {
     this.data = data;
     date.setInnerText(data.getDate());
     source.setInnerHTML(data.getSource());
-    title.setInnerText(data.getTitle());
+    title.setInnerHTML(data.getTitle());
   }
 
   public void setData(NotificationReceivedDTO data) {
@@ -108,7 +108,7 @@ public void setData(NotificationReceivedDTO data) {
     date.setInnerText(data.getDate());
     author.setInnerText(data.getAuthor());
     source.setInnerText(data.getSource());
-    title.setInnerText(data.getTitle());
+    title.setInnerHTML(data.getTitle());
     if (data.getReaden() == 0) {
       getElement().addClassName("not-read");
     }

From 7e64ce163dae9273d2054a5de2a5063661efd45e Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 15 Feb 2024 15:36:24 +0100
Subject: [PATCH 192/228] Fix #13993

---
 .../apps/profile/pages/ProfilePage.java       | 19 ++++++----
 .../apps/profile/pages/ProfilePage.ui.xml     | 35 ++++++++++---------
 .../org/silverpeas/mobile/public/spmobile.css |  8 +++++
 .../server/services/helpers/UserHelper.java   |  2 ++
 .../mobile/shared/dto/DetailUserDTO.java      |  9 +++++
 5 files changed, 50 insertions(+), 23 deletions(-)

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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 7d075e3b0..2facb2ac7 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
@@ -3029,3 +3029,11 @@ a.popin-btn {
   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/services/helpers/UserHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/UserHelper.java
index 84effe6f7..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
@@ -72,6 +72,8 @@ public DetailUserDTO populate(UserDetail user) {
     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;
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 ed1d6840a..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
@@ -46,6 +46,7 @@ public class DetailUserDTO implements Serializable{
   private String sessionKey;
   private boolean connected;
   private boolean notificationBox;
+  private boolean ldap;
   private List<PropertyDTO> properties = new ArrayList<>();
 
   public void addProperty(String key, String value) {
@@ -176,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;
+  }
 }

From 419d5b9b1a71131024a1d1380da6d1d0fa483f59 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 15 Feb 2024 16:22:02 +0100
Subject: [PATCH 193/228] Fix #14002

---
 .../mobile/client/pages/cookies/CookiesPage.ui.xml     | 10 +++++-----
 .../java/org/silverpeas/mobile/public/spmobile.css     |  8 ++++----
 2 files changed, 9 insertions(+), 9 deletions(-)

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
index 324fac6ef..5287bacae 100644
--- 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
@@ -31,13 +31,13 @@
 
   <g:HTMLPanel>
     <div id="header">
-      <h1 id="page-cookies-title"><ui:safehtml from="{msg.informationTitle}"/></h1>
+      <h1 id="page-infos-title"><ui:safehtml from="{msg.informationTitle}"/></h1>
     </div>
 
-    <div id="page-cookies" class="ui-content ui-body-a">
-      <div class="cookiesTextContainer">
-        <g:HTML ui:field="text" styleName="cookiesText"></g:HTML>
-        <div class="cookiesTextActions">
+    <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>
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 2facb2ac7..3122b155d 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
@@ -3005,7 +3005,7 @@ a.popin-btn {
 }
 
 /**** Cookies information page ****/
-.cookiesTextContainer {
+.infosTextContainer {
   background-color: white;
   height: 25vh;
   padding: 2em;
@@ -3015,16 +3015,16 @@ a.popin-btn {
   border-radius: 0.25em;
 }
 
-.cookiesText {
+.infosText {
   height: 20vh;
   text-align: justify;
   line-height: 1.2em;
 }
-.cookiesTextActions {
+.infosTextActions {
   text-align: right;
 }
 
-#header #page-cookies-title {
+#header #page-infos-title {
   left: 1em;
   right: 1em;
 }

From b1a4fe719764636e45d29753e8b94b8f744d4958 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 15 Feb 2024 18:19:00 +0100
Subject: [PATCH 194/228] Fix #14001

---
 .../server/services/helpers/NewsHelper.java   | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

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 1d656df19..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
@@ -84,7 +84,7 @@ public List<News> getLastNews(String userId, String spaceId, int maxNews) throws
       for (String appId : appIds) {
         news.addAll(service.getVisibleNews(appId));
       }
-      news = sortAndTruncate(maxNews, news);
+      news = sortAndTruncate(maxNews, news, false);
       return news;
     } else {
       // News on main page
@@ -96,11 +96,14 @@ public List<News> getLastNews(String userId, String spaceId, int maxNews) throws
       } catch (MissingResourceException e) {}
       if (newsSource != null && newsSource.isEmpty() == false) {
           if (newsSource.trim().startsWith("quickinfo")) {
-            news = getNewsByComponentId(newsSource, false, userId, maxNews);
-            news = sortAndTruncate(maxNews, news);
+            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, maxNews);
-            news = sortAndTruncate(maxNews, news);
+            news = sortAndTruncate(maxNews, news, true);
           } else {
             news = getDelegatedNews(userId, maxNews);
           }
@@ -165,7 +168,7 @@ private List<News> getAllNews(String userId, int maxNews) throws AdminException
     for (String appId : apps) {
       news.addAll(getNewsByComponentId(appId, false, userId, maxNews));
     }
-    news = sortAndTruncate(maxNews, news);
+    news = sortAndTruncate(maxNews, news, false);
 
     return news;
   }
@@ -181,14 +184,14 @@ private List<News> getNewsByComponentId(String appId, boolean managerAccess, Str
         news = service.getVisibleNews(appId);
       }
     }
-    news = sortAndTruncate(maxNews, news);
+    news = sortAndTruncate(maxNews, news, false);
 
     return news;
   }
 
-  private static List<News> sortAndTruncate(int maxNews, List<News> news) {
+  private static List<News> sortAndTruncate(int maxNews, List<News> news, boolean reverse) {
     Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate()));
-    //Collections.reverse(news);
+    if (reverse) Collections.reverse(news);
     if (news != null && news.size() > maxNews) {
       news = news.subList(0, maxNews);
     }

From 98b0800137f709ce3ee0ec61f2870777e4b843d9 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 16 Feb 2024 15:25:15 +0100
Subject: [PATCH 195/228] favorites mutli selection

---
 .../client/apps/favorites/FavoritesApp.java   | 32 ++++++++--
 .../events/app/FavoritesAppEventHandler.java  |  1 +
 .../events/app/FavoritesDeleteEvent.java      | 50 +++++++++++++++
 .../apps/favorites/pages/FavoritesPage.java   | 52 ++++++++++++++-
 .../favorites/pages/widgets/DeleteButton.java | 61 ++++++++++++++++++
 .../pages/widgets/DeleteButton.ui.xml         | 31 +++++++++
 .../resources/FavoritesMessages.java          |  2 +
 .../resources/FavoritesMessages.properties    |  3 +-
 .../resources/FavoritesMessages_en.properties |  3 +-
 .../resources/FavoritesMessages_fr.properties |  3 +-
 .../pages/widgets/FavoriteItem.java           | 64 ++++++++++++++++---
 .../pages/widgets/FavoriteItem.ui.xml         | 11 +++-
 .../components/homepage/HomePageContent.java  |  9 ++-
 .../org/silverpeas/mobile/public/spmobile.css | 20 +++---
 .../shared/services/rest/ServiceMyLinks.java  | 11 ++--
 15 files changed, 316 insertions(+), 37 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/events/app/FavoritesDeleteEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.ui.xml

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 bfc2bc8e5..9e588acaa 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
@@ -26,11 +26,7 @@
 
 import com.google.gwt.core.client.GWT;
 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;
@@ -141,7 +137,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/pages/FavoritesPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/FavoritesPage.java
index 413e6ce74..55ee6b564 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,24 @@
 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.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.resources.FavoritesMessages;
 import org.silverpeas.mobile.client.apps.navigation.pages.widgets.FavoriteItem;
+import org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets.DeleteButton;
 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.resources.ApplicationMessages;
-import org.silverpeas.mobile.shared.dto.FavoriteDTO;
 import org.silverpeas.mobile.shared.dto.MyLinkDTO;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class FavoritesPage extends PageContent implements FavoritesPagesEventHandler {
@@ -50,6 +55,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 +78,51 @@ public void stop() {
 
   @Override
   public void onFavoritesLoaded(final FavoritesLoadedEvent event) {
-
+    favorites.clear();
     List<MyLinkDTO> favoritesList = event.getFavorites();
     for (MyLinkDTO favoriteDTO : favoritesList) {
       FavoriteItem item = new FavoriteItem();
+      item.setParent(this);
       item.setData(favoriteDTO);
       favorites.add(item);
     }
   }
+
+  @Override
+  public void setSelectionMode(boolean selectionMode) {
+    super.setSelectionMode(selectionMode);
+    if (selectionMode) {
+      clearActions();
+      buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedFavoris();}});
+      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();
+  }
+
+  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/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.java
new file mode 100644
index 000000000..4520925de
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.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.client.apps.favorites.pages.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.apps.notificationsbox.pages.NotificationsBoxPage;
+import org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages;
+import org.silverpeas.mobile.client.components.base.ActionItem;
+
+/**
+ * @author: svu
+ */
+public class DeleteButton extends ActionItem {
+
+  interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
+
+  private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class);
+
+  @UiField
+  HTMLPanel container;
+  @UiField
+  Anchor link;
+
+  public DeleteButton() {
+    initWidget(uiBinder.createAndBindUi(this));
+    setId("delete-favoris");
+  }
+
+  @UiHandler("link")
+  void delete(ClickEvent event) {
+    getCallback().execute();
+  }
+}
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.ui.xml
new file mode 100644
index 000000000..0c03aa73a
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.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="delete-favoris">
+        <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/favorites/resources/FavoritesMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/resources/FavoritesMessages.java
index 994ee4daa..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
@@ -30,4 +30,6 @@ 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 b8480eb24..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,4 +23,5 @@
 #
 
 addToFavoritesContent=Ajouter en favoris
-favoriteAdded=Favoris ajouté !
\ No newline at end of file
+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 27dc8e7b3..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,4 +23,5 @@
 #
 
 addToFavoritesContent=Add to favorites
-favoriteAdded=Favorite added !
\ No newline at end of file
+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 b8480eb24..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,4 +23,5 @@
 #
 
 addToFavoritesContent=Ajouter en favoris
-favoriteAdded=Favoris ajouté !
\ No newline at end of file
+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/navigation/pages/widgets/FavoriteItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java
index 0f18f0e5c..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
@@ -26,31 +26,48 @@
 
 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;
+  SpanElement icon, title, desc;
 
+  private boolean minimalView = true;
 
   interface FavoriteItemUiBinder extends UiBinder<Widget, FavoriteItem> {
   }
@@ -59,11 +76,24 @@ 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
@@ -72,14 +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) {
-    HyperLinkDTO link = new HyperLinkDTO();
-    link.setUrl(data.getUrl());
-    LinksManager.processLink(link);
+  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 ace0654ff..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,8 +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">
-		<span ui:field="icon" class="icon-app"></span>
-		<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/components/homepage/HomePageContent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/homepage/HomePageContent.java
index a53eaa78f..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
@@ -145,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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 3122b155d..40ab7a495 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
@@ -1479,7 +1479,7 @@ li > #operations {
 }
 
 #notification .list-notifications > li.selected, .list-resources > li.selected, #tasks > li.selected,
-.notifications > li.selected, .shares > li.selected {
+.notifications > li.selected, .shares > li.selected, .favoris > li.selected {
   border-left: 8px solid #7eb73a;
   color: #000
 }
@@ -2160,6 +2160,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 {
@@ -2787,12 +2789,6 @@ a.popin-btn {
   padding-right: 1em;
 }
 
-/*.sharesBox .ui-listview.shares .notification-title{
-  margin-bottom:0.75em;
-  color: #000;
-  user-select: none;
-}*/
-
 .ui-listview.shares li span {
   display:block;
 }
@@ -2815,6 +2811,14 @@ a.popin-btn {
   background-color: #FFF;
 }
 
+/********* favorites **************/
+.favorite-desc {
+  display: block;
+  padding-top: 1em;
+}
+
+
+
 /********* notification **************/
 .notificationBox .ui-listview.notifications  input {
 	position:absolute;
@@ -2874,7 +2878,7 @@ a.popin-btn {
   right: 1em;
 }
 
-.delete-notification, .delete-share a {
+.delete-notification, .delete-share a, .delete-favoris {
   height: 24px;
   width: 24px;
   filter: invert(1);
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..38d7951f6 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
@@ -29,10 +29,8 @@
 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 +48,9 @@ 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);
+
+
 }

From e575c85d7f067b948e8d2ba5b5869baeb8c6859a Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 16 Feb 2024 16:18:21 +0100
Subject: [PATCH 196/228] refactoring delete button

---
 .../apps/favorites/pages/FavoritesPage.java   |   3 +-
 .../pages/NotificationsBoxPage.java           |   4 +-
 .../pages/widgets/DeleteButton.java           |  78 ---------
 .../pages/widgets/DeleteButton.ui.xml         |  33 ----
 .../apps/sharesbox/pages/SharesBoxPage.java   |   3 +-
 .../sharesbox/pages/widgets/DeleteButton.java |  65 -------
 .../pages/widgets/DeleteButton.ui.xml         |  34 ----
 .../mobile/client/apps/tasks/TasksPage.java   | 158 ++++++++++++++++++
 .../client/apps/tasks/pages/TasksPage.java    |   1 -
 .../tasks/pages/widgets/DeleteTaskButton.java |  59 -------
 .../pages/widgets/DeleteTaskButton.ui.xml     |  32 ----
 .../base}/widgets/DeleteButton.java           |   5 +-
 .../base}/widgets/DeleteButton.ui.xml         |   2 +-
 .../org/silverpeas/mobile/public/spmobile.css |  16 +-
 14 files changed, 171 insertions(+), 322 deletions(-)
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.java
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.ui.xml
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.java
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.ui.xml
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.ui.xml
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/{apps/favorites/pages => components/base}/widgets/DeleteButton.java (87%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/{apps/favorites/pages => components/base}/widgets/DeleteButton.ui.xml (99%)

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 55ee6b564..e0edc3a40 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
@@ -36,11 +36,11 @@
 import org.silverpeas.mobile.client.apps.favorites.events.pages.FavoritesPagesEventHandler;
 import org.silverpeas.mobile.client.apps.favorites.resources.FavoritesMessages;
 import org.silverpeas.mobile.client.apps.navigation.pages.widgets.FavoriteItem;
-import org.silverpeas.mobile.client.apps.notificationsbox.pages.widgets.DeleteButton;
 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.MyLinkDTO;
 
@@ -94,6 +94,7 @@ public void setSelectionMode(boolean selectionMode) {
     if (selectionMode) {
       clearActions();
       buttonDelete.setCallback(new Command() {@Override public void execute() {deleteSelectedFavoris();}});
+      buttonDelete.setId("delete-favoris");
       addActionShortcut(buttonDelete);
     } else {
       clearActions();
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 7e0063f60..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
@@ -40,7 +40,6 @@
 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;
@@ -48,6 +47,7 @@
 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.notifications.NotificationBoxDTO;
 import org.silverpeas.mobile.shared.dto.notifications.NotificationReceivedDTO;
@@ -80,8 +80,8 @@ public NotificationsBoxPage() {
     initWidget(uiBinder.createAndBindUi(this));
     EventBus.getInstance().addHandler(AbstractNotificationsBoxPagesEvent.TYPE, this);
     EventBus.getInstance().fireEvent(new NotificationsLoadEvent());
-    buttonDelete.setParentPage(this);
     buttonNotRead.setParentPage(this);
+    buttonDelete.setId("delete-notifications");
   }
 
   @Override
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/apps/notificationsbox/pages/widgets/DeleteButton.java
deleted file mode 100644
index 4ec466bdf..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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.notificationsbox.pages.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.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.components.base.ActionItem;
-import org.silverpeas.mobile.client.components.base.ActionsMenu;
-import org.silverpeas.mobile.shared.dto.notifications.NotificationBoxDTO;
-
-import java.util.List;
-
-/**
- * @author: svu
- */
-public class DeleteButton extends ActionItem {
-
-  interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
-
-  private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class);
-
-  private NotificationsBoxPage parentPage;
-
-  @UiField
-  HTMLPanel container;
-  @UiField
-  Anchor link;
-
-  @UiField(provided = true)
-  protected NotificationsMessages msg = null;
-
-
-  public DeleteButton() {
-    msg = GWT.create(NotificationsMessages.class);
-    initWidget(uiBinder.createAndBindUi(this));
-    setId("delete-notification");
-  }
-
-  @UiHandler("link")
-  void delete(ClickEvent event) {
-    getCallback().execute();
-  }
-
-  public void setParentPage(final NotificationsBoxPage parentPage) {
-    this.parentPage = parentPage;
-  }
-}
\ 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/apps/notificationsbox/pages/widgets/DeleteButton.ui.xml
deleted file mode 100644
index 4cd11cd25..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/pages/widgets/DeleteButton.ui.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-  ~ 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.notificationsbox.resources.NotificationsMessages'/>
-
-    <g:HTMLPanel tag="li" ui:field="container" styleName="delete-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/sharesbox/pages/SharesBoxPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/SharesBoxPage.java
index cc7b6a7fc..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
@@ -33,13 +33,13 @@
 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.PageContent;
+import org.silverpeas.mobile.client.components.base.widgets.DeleteButton;
 import org.silverpeas.mobile.shared.dto.tickets.TicketDTO;
 
 import java.util.ArrayList;
@@ -99,6 +99,7 @@ public SharesBoxPage() {
     setPageTitle(msg.title());
     initWidget(uiBinder.createAndBindUi(this));
     EventBus.getInstance().addHandler(AbstractSharesBoxPagesEvent.TYPE, this);
+    buttonDelete.setId("delete-share");
   }
 
   @Override
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/apps/sharesbox/pages/widgets/DeleteButton.java
deleted file mode 100644
index 24c593333..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.sharesbox.pages.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.apps.sharesbox.resources.ShareMessages;
-import org.silverpeas.mobile.client.components.base.ActionItem;
-
-/**
- * @author: svu
- */
-public class DeleteButton extends ActionItem {
-
-  interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
-
-  private static DeleteButtonUiBinder uiBinder = GWT.create(DeleteButtonUiBinder.class);
-
-  @UiField
-  HTMLPanel container;
-  @UiField
-  Anchor link;
-
-  @UiField(provided = true)
-  protected ShareMessages msg = null;
-
-
-  public DeleteButton() {
-    msg = GWT.create(ShareMessages.class);
-    initWidget(uiBinder.createAndBindUi(this));
-    setId("delete-share");
-  }
-
-  @UiHandler("link")
-  void delete(ClickEvent event) {
-    getCallback().execute();
-  }
-}
\ 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/apps/sharesbox/pages/widgets/DeleteButton.ui.xml
deleted file mode 100644
index 0c882f21f..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/sharesbox/pages/widgets/DeleteButton.ui.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-  ~ 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.sharesbox.resources.ShareMessages'/>
-
-    <g:HTMLPanel tag="li" ui:field="container" styleName="delete-share">
-        <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/tasks/TasksPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java
new file mode 100644
index 000000000..666ecf5f6
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.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.client.apps.tasks;
+
+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.AddTaskButton;
+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.DeleteButton;
+import org.silverpeas.mobile.shared.dto.TaskDTO;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * @author: svu
+ */
+public class TasksPage extends PageContent implements TasksPagesEventHandler {
+
+  interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
+  private static TasksPageUiBinder uiBinder = GWT.create(TasksPageUiBinder.class);
+  private AddTaskButton buttonCreate = new AddTaskButton();
+
+  private DeleteButton buttonDelete = new DeleteButton();
+  @UiField HTMLPanel container;
+  @UiField
+  UnorderedList list;
+
+  private TasksMessages msg = GWT.create(TasksMessages .class);
+
+  public TasksPage() {
+    initWidget(uiBinder.createAndBindUi(this));
+    list.getElement().setId("tasks");
+    EventBus.getInstance().fireEvent(new TasksLoadEvent());
+    EventBus.getInstance().addHandler(AbstractTasksPagesEvent.TYPE, this);
+    buttonDelete.setId("delete-task");
+  }
+
+  @Override
+  public void onTaskLoad(final TasksLoadedEvent event) {
+    Notification.activityStop();
+    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);
+      }
+    }
+  }
+
+  @Override
+  public void onTaskCreated(final TaskCreatedEvent taskCreatedEvent) {
+    TaskItem item = new TaskItem();
+    item.setParent(this);
+    item.setData(taskCreatedEvent.getTask());
+    list.add(item);
+  }
+
+  @Override
+  public void onTaskUpdated(TaskUpdatedEvent taskUpdatedEvent) {
+    int i = 0;
+    while (i < list.getWidgetCount()) {
+      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();
+          item.setData(taskUpdatedEvent.getTask());
+          list.add(item);
+          break;
+        }
+      }
+      i++;
+    }
+  }
+
+  @Override
+  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.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.java
index 67d17709e..166dffa0f 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
@@ -37,7 +37,6 @@
 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.AddTaskButton;
-import org.silverpeas.mobile.client.apps.tasks.pages.widgets.DeleteTaskButton;
 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;
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java
deleted file mode 100644
index 736e6c613..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.pages.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.Widget;
-import org.silverpeas.mobile.client.apps.tasks.resources.TasksMessages;
-import org.silverpeas.mobile.client.components.base.ActionItem;
-
-/**
- * @author: svu
- */
-public class DeleteTaskButton extends ActionItem {
-
-  interface DeleteTaskItemUiBinder extends UiBinder<Widget, DeleteTaskButton> {
-  }
-
-  @UiField Anchor link;
-  @UiField(provided = true) protected TasksMessages msg = null;
-
-  private static DeleteTaskItemUiBinder uiBinder = GWT.create(DeleteTaskItemUiBinder.class);
-  public DeleteTaskButton() {
-    setId("delete-task");
-    msg = GWT.create(TasksMessages.class);
-    initWidget(uiBinder.createAndBindUi(this));
-  }
-
-  @UiHandler("link")
-  void deleteTasks(ClickEvent event) {
-    getCallback().execute();
-  }
-}
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.ui.xml
deleted file mode 100644
index 93e99db44..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/DeleteTaskButton.ui.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ 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.apps.tasks.resources.TasksMessages'/>
-
-  <g:HTMLPanel tag="li" ui:field="container" styleName="delete-task">
-    <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/favorites/pages/widgets/DeleteButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.java
similarity index 87%
rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.java
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.java
index 4520925de..dc177911b 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/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.favorites.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,8 +31,6 @@
 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.notificationsbox.pages.NotificationsBoxPage;
-import org.silverpeas.mobile.client.apps.notificationsbox.resources.NotificationsMessages;
 import org.silverpeas.mobile.client.components.base.ActionItem;
 
 /**
@@ -51,7 +49,6 @@ interface DeleteButtonUiBinder extends UiBinder<HTMLPanel, DeleteButton> {}
 
   public DeleteButton() {
     initWidget(uiBinder.createAndBindUi(this));
-    setId("delete-favoris");
   }
 
   @UiHandler("link")
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.ui.xml
similarity index 99%
rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.ui.xml
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.ui.xml
index 0c03aa73a..e4cc3f063 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/DeleteButton.ui.xml
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/DeleteButton.ui.xml
@@ -25,7 +25,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" ui:field="container" styleName="delete-favoris">
+    <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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 40ab7a495..af9a2b7d1 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
@@ -817,7 +817,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 0em;
 }
 
-#actionsList:has(.add-task),  #actionsList:has(.delete-task), #actionsList:has(.delete-share) {
+#actionsList:has(.add-task) {
   right: 1em;
 }
 
@@ -827,14 +827,8 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   filter: invert(1);
   background: url('icons/add.svg') no-repeat;
 }
-.delete-task {
-  height: 24px;
-  width: 24px;
-  filter: invert(1);
-  background: url('icons/delete.svg') no-repeat;
-}
 
-.add-task a, .delete-task a {
+.add-task a {
   height: 24px;
   width: 24px;
   display: block;
@@ -2874,11 +2868,11 @@ a.popin-btn {
 	background-color: #FFF;
 }
 
-#actionsList:has(.delete-notification) {
+#actionsList:has(.delete-action) {
   right: 1em;
 }
 
-.delete-notification, .delete-share a, .delete-favoris {
+.delete-action {
   height: 24px;
   width: 24px;
   filter: invert(1);
@@ -2892,7 +2886,7 @@ a.popin-btn {
   background: url('icons/mark_read.svg') no-repeat;
 }
 
-.delete-notification a, .markAsRead-notification a, .delete-share a {
+.delete-action a, .markAsRead-notification a {
   height: 24px;
   width: 24px;
   display: block;

From b8358ec38fada6aeb0237bc0f7d97ba04d6b2b2b Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 19 Feb 2024 11:42:44 +0100
Subject: [PATCH 197/228] display favorites categories

---
 .../client/apps/favorites/FavoritesApp.java   | 84 +++++++++++++++----
 .../events/pages/FavoritesLoadedEvent.java    |  8 +-
 .../apps/favorites/pages/FavoritesPage.java   | 21 +++--
 .../favorites/pages/widgets/CategoryItem.java | 76 +++++++++++++++++
 .../pages/widgets/CategoryItem.ui.xml         | 36 ++++++++
 .../resources/ApplicationResources.java       |  8 ++
 .../client/resources/icons/expand_less.svg    |  1 +
 .../client/resources/icons/expand_more.svg    |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 23 +++++
 .../server/services/ServiceMyLinks.java       | 61 ++++++++++++++
 .../mobile/shared/dto/MyLinkCategoryDTO.java  | 81 ++++++++++++++++++
 .../mobile/shared/dto/MyLinkDTO.java          | 10 +++
 12 files changed, 384 insertions(+), 26 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.ui.xml
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_less.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/expand_more.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMyLinks.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/MyLinkCategoryDTO.java

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 9e588acaa..43396f476 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,6 +25,7 @@
 package org.silverpeas.mobile.client.apps.favorites;
 
 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.favorites.events.app.*;
 import org.silverpeas.mobile.client.apps.favorites.events.pages.FavoritesLoadedEvent;
@@ -40,10 +41,11 @@
 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 {
 
@@ -67,23 +69,75 @@ 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);
+            //TODO : autre favoris et ordre
+            List groupedList = new ArrayList<>();
+            List noCatList = new ArrayList<>();
+            MyLinkCategoryDTO itemNoCat = new MyLinkCategoryDTO();
+            itemNoCat.setName("Autres favoris");
+            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
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 e0edc3a40..4bf43b6c2 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
@@ -28,12 +28,14 @@
 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;
@@ -42,6 +44,7 @@
 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.MyLinkCategoryDTO;
 import org.silverpeas.mobile.shared.dto.MyLinkDTO;
 
 import java.util.ArrayList;
@@ -79,12 +82,18 @@ public void stop() {
   @Override
   public void onFavoritesLoaded(final FavoritesLoadedEvent event) {
     favorites.clear();
-    List<MyLinkDTO> favoritesList = event.getFavorites();
-    for (MyLinkDTO favoriteDTO : favoritesList) {
-      FavoriteItem item = new FavoriteItem();
-      item.setParent(this);
-      item.setData(favoriteDTO);
-      favorites.add(item);
+    List favoritesList = event.getFavorites();
+    for (Object it : favoritesList) {
+      if (it instanceof MyLinkDTO) {
+        FavoriteItem item = new FavoriteItem();
+        item.setParent(this);
+        item.setData((MyLinkDTO) it);
+        favorites.add(item);
+      } else if (it instanceof MyLinkCategoryDTO) {
+        CategoryItem item = new CategoryItem();
+        item.setData((MyLinkCategoryDTO) it);
+        favorites.add(item);
+      }
     }
   }
 
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..6444cf348
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.java
@@ -0,0 +1,76 @@
+/*
+ * 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.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+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.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;
+
+public class CategoryItem extends SelectableItem {
+
+  private MyLinkCategoryDTO data;
+  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 MyLinkCategoryDTO getData() {
+    return data;
+  }
+
+}
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.ui.xml
new file mode 100644
index 000000000..d5286d2cf
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/pages/widgets/CategoryItem.ui.xml
@@ -0,0 +1,36 @@
+<!--
+  ~ 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">
+
+	<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>
+
+</ui:UiBinder> 
\ 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 df93d10f4..4ef94393d 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
@@ -47,6 +47,14 @@ public interface ApplicationResources extends ClientBundle {
   @DataResource.MimeType("image/svg+xml")
   TextResource favorite();
 
+  @Source("icons/expand_more.svg")
+  @DataResource.MimeType("image/svg+xml")
+  TextResource more();
+
+  @Source("icons/expand_less.svg")
+  @DataResource.MimeType("image/svg+xml")
+  TextResource less();
+
   @Source("icons/call.svg")
   @DataResource.MimeType("image/svg+xml")
   TextResource call();
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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index af9a2b7d1..6c115e289 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
@@ -2135,6 +2135,29 @@ form .forms .fields > li:nth-child(even) {
   fill : #a9a9a9;
 }
 
+.ui-listview.favoris .category {
+
+}
+
+.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 ***/
 .gwt-PopupPanel {
   left: 0;
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/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;
+  }
 }

From a2a3baf6563a137d81d3c0410db207e503dde281 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 19 Feb 2024 18:53:05 +0100
Subject: [PATCH 198/228] enhance favorites categories

---
 .../client/apps/favorites/FavoritesApp.java   |  3 +-
 .../apps/favorites/pages/FavoritesPage.java   |  4 +++
 .../favorites/pages/widgets/CategoryItem.java | 36 +++++++++++++++++++
 .../client/resources/ApplicationMessages.java |  3 ++
 .../ApplicationMessages_en.properties         |  4 ++-
 .../ApplicationMessages_fr.properties         |  4 ++-
 .../org/silverpeas/mobile/public/spmobile.css | 20 +++++++++--
 7 files changed, 68 insertions(+), 6 deletions(-)

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 43396f476..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
@@ -90,11 +90,10 @@ private void loadMyLinks(List<MyLinkCategoryDTO> categories) {
           @Override
           public void onSuccess(final Method method, final List<MyLinkDTO> links) {
             super.onSuccess(method, links);
-            //TODO : autre favoris et ordre
             List groupedList = new ArrayList<>();
             List noCatList = new ArrayList<>();
             MyLinkCategoryDTO itemNoCat = new MyLinkCategoryDTO();
-            itemNoCat.setName("Autres favoris");
+            itemNoCat.setName(msg.favoritesWithoutCategory());
             groupedList.add(itemNoCat);
             for(MyLinkDTO link : links) {
                 if (link.getCategoryId() == null) {
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 4bf43b6c2..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
@@ -83,16 +83,20 @@ public void stop() {
   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;
       }
     }
   }
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
index 6444cf348..4f0d168ee 100644
--- 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
@@ -26,19 +26,29 @@
 
 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
@@ -69,8 +79,34 @@ public void setData(MyLinkCategoryDTO data) {
       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.more().getText());
+      } else {
+        icon.setInnerHTML(resources.less().getText());
+      }
+      for (FavoriteItem item : favorites) {
+        //item.setVisible(expanded);
+        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/resources/ApplicationMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java
index 362e7e880..35c210e0b 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
@@ -200,4 +200,7 @@ public interface ApplicationMessages extends Messages {
 
   @DefaultMessage("Partager")
   String share();
+
+  @DefaultMessage("Autres favoris")
+  String favoritesWithoutCategory();
 }
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 924bf0a65..5fe780552 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
@@ -85,4 +85,6 @@ sended=Sended
 
 notfoundError=Ressource not found
 
-share=Share
\ No newline at end of file
+share=Share
+
+favoritesWithoutCategory=Others favorites
\ 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 5671729fb..3eacdf2f2 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
@@ -90,4 +90,6 @@ sended=Envoyées
 
 notfoundError=Ressource non trouv�e
 
-share=Partager
\ No newline at end of file
+share=Partager
+
+favoritesWithoutCategory=Autres favoris
\ No newline at end of file
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 6c115e289..0b29b5c25 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
@@ -511,7 +511,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 .ui-page-content {
   padding: 0;
-  min-height: 100vh;
+  min-height: calc(100vh - 92px);
 }
 
 #menu-principal {
@@ -1342,6 +1342,18 @@ audio::-webkit-media-controls-enclosure {
   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;
 }
@@ -2126,6 +2138,10 @@ form .forms .fields > li:nth-child(even) {
   padding-left: 1em;
 }
 
+.ui-listview.favoris {
+  overflow: hidden;
+}
+
 .ui-listview.favoris a {
   padding-left: 2.5em;
 }
@@ -2136,7 +2152,7 @@ form .forms .fields > li:nth-child(even) {
 }
 
 .ui-listview.favoris .category {
-
+  z-index: 3;
 }
 
 .ui-listview.favoris .category .category-title {

From de2664388a8eb52d671628e878b5650851c6d916 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 20 Feb 2024 22:14:39 +0100
Subject: [PATCH 199/228] enhance popup

---
 .../client/components/PopinConfirmation.java   | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

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) {

From a9ab8cea6cd8c25bfa774fda95c3d14a8679a7ae Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 21 Feb 2024 19:02:35 +0100
Subject: [PATCH 200/228] avoid unwanted actions

---
 .../components/attachments/Attachment.java    | 24 +++++++++++++------
 1 file changed, 17 insertions(+), 7 deletions(-)

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 55ee5cf51..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
@@ -201,20 +201,27 @@ private void toogleOperations() {
     }
   }
 
+  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 (MobilUtils.isIOS()) {
+    if (isVisibleOperations()) {
+      if (MobilUtils.isIOS()) {
         if (data.isDownloadable()) {
           String u = link.getHref();
           if (NetworkHelper.isOnline()) {
@@ -235,16 +242,19 @@ protected void download(ClickEvent event) {
           viewDocument();
         }
       }
+    }
   }
 
   @UiHandler("view")
   protected void view(ClickEvent event) {
-    viewDocument();
+    if (isVisibleOperations()) viewDocument();
   }
 
   @UiHandler("notify")
   protected void notify(ClickEvent event) {
-    NotificationsApp app = new NotificationsApp(data.getInstanceId(), data.getId(), NotificationDTO.TYPE_DOCUMENT, data.getFileName(), data.getFileName());
-    app.start();
+    if (isVisibleOperations()) {
+      NotificationsApp app = new NotificationsApp(data.getInstanceId(), data.getId(), NotificationDTO.TYPE_DOCUMENT, data.getFileName(), data.getFileName());
+      app.start();
+    }
   }
 }

From 509bb383ecefe06be30f495c7bf0552c7737f673 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 22 Feb 2024 16:40:04 +0100
Subject: [PATCH 201/228] draftout publication

---
 .../client/apps/documents/DocumentsApp.java   | 26 ++++++-
 .../events/app/DocumentsAppEventHandler.java  |  2 +
 .../events/app/DocumentsPublishEvent.java     | 48 ++++++++++++
 .../navigation/GedItemPublishedEvent.java     | 50 ++++++++++++
 .../GedNavigationPagesEventHandler.java       |  2 +
 .../publication/PublicationLoadedEvent.java   | 10 ++-
 ...ublicationNavigationPagesEventHandler.java |  7 +-
 .../PublicationPublishedEvent.java            | 48 ++++++++++++
 .../documents/pages/GedNavigationPage.java    | 18 ++++-
 .../apps/documents/pages/PublicationPage.java | 29 +++++--
 .../pages/widgets/DraftOutButton.java         | 77 +++++++++++++++++++
 .../pages/widgets/DraftOutButton.ui.xml       | 33 ++++++++
 .../apps/documents/pages/widgets/GedItem.java | 12 +++
 .../resources/DocumentsMessages.java          |  2 +
 .../resources/DocumentsMessages.properties    |  4 +-
 .../resources/DocumentsMessages_en.properties |  4 +-
 .../resources/DocumentsMessages_fr.properties |  4 +-
 .../client/apps/tasks/pages/TasksPage.java    |  3 +-
 .../services/AbstractRestWebService.java      |  7 +-
 .../server/services/ServiceDocuments.java     | 41 +++++++---
 .../shared/dto/documents/PublicationDTO.java  | 20 +++++
 .../navigation/ApplicationInstanceDTO.java    |  9 +++
 .../services/rest/ServiceDocuments.java       |  5 ++
 .../shared/services/rest/ServiceMyLinks.java  |  5 ++
 24 files changed, 431 insertions(+), 35 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/app/DocumentsPublishEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/navigation/GedItemPublishedEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/events/pages/publication/PublicationPublishedEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/widgets/DraftOutButton.ui.xml

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 e580ce63d..973870e06 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;
@@ -278,7 +280,7 @@ public void onSuccess(final Method method, final PublicationDTO result) {
             new PublicationLoadedEvent(result, getApplicationInstance().getCommentable(),
                 getApplicationInstance().getAbleToStoreContent(),
                 getApplicationInstance().getNotifiable(), getApplicationInstance().getPublicationSharing(),
-                    event.getContent().getType(), getCanImport()));
+                    event.getContent().getType(), getCanImport(), result.isPublishable()));
       }
     };
     action.attempt();
@@ -344,4 +346,26 @@ public void onSuccess(Method method, PublicationDTO publicationDTO) {
       }
     });
   }
+
+  @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 7a7a7f67f..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
@@ -33,4 +33,6 @@ public interface DocumentsAppEventHandler extends EventHandler {
   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/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/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 b46067105..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
@@ -35,7 +35,10 @@ public class PublicationLoadedEvent extends AbstractPublicationPagesEvent {
 
   private boolean canImport = false;
 
-  public PublicationLoadedEvent(PublicationDTO publication, boolean commentable, boolean ableToStoreContent, boolean notifiable, int sharing, String type, boolean canImport) {
+  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;
@@ -44,6 +47,7 @@ public PublicationLoadedEvent(PublicationDTO publication, boolean commentable, b
     this.sharing = sharing;
     this.type = type;
     this.canImport = canImport;
+    this.canPublish = canPublish;
   }
 
   @Override
@@ -72,4 +76,8 @@ public boolean isNotifiable() {
   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 85a690de5..079a5d16f 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
@@ -30,10 +30,7 @@
 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;
@@ -177,6 +174,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/PublicationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java
index 3e44a3511..db8628b64 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
@@ -33,6 +33,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.FocusPanel;
 import com.google.gwt.user.client.ui.HTMLPanel;
@@ -41,11 +42,10 @@
 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.app.DocumentsNextPublicationEvent;
-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.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;
@@ -101,7 +101,7 @@ public class PublicationPage extends PageContent
   private AddToFavoritesButton favorite = new AddToFavoritesButton();
 
   private AddFileButton buttonImport = new AddFileButton();
-
+  private DraftOutButton buttonDraftOut = new DraftOutButton();
   private ShareButton share = new ShareButton();
   private ContentDTO contentDTO = null;
   private boolean canImport = false;
@@ -135,6 +135,7 @@ public PublicationPage() {
     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);
@@ -197,6 +198,16 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
       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);
+    }
   }
 
   @Override
@@ -220,8 +231,14 @@ public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEve
     }
   }
 
+  @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()) {
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 57cee45f2..6f5a1ec64 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
@@ -59,6 +59,10 @@ public GedItem() {
     msg = GWT.create(ApplicationMessages.class);
   }
 
+  public Object getData() {
+    return data;
+  }
+
   public void setData(Object data) {
     this.data = data;
     if (data instanceof TopicDTO) {
@@ -88,6 +92,14 @@ public void setData(Object data) {
 
   }
 
+  public void setPublicationName(String name) {
+    if (dataPublication != null) {
+      dataPublication.setName(name);
+      ((PublicationDTO) data).setName(name);
+      link.setHTML(name);
+    }
+  }
+
   @UiHandler("link")
   protected void onClick(ClickEvent event) {
     EventBus.getInstance().fireEvent(new GedItemClickEvent(data));
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 984af7e8e..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
@@ -62,4 +62,6 @@ public interface DocumentsMessages extends Messages {
   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 78720b514..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
@@ -55,4 +55,6 @@ commentsLabel=Message compl&eacute;mentaire
 
 importFile=Importer un fichier
 maxUploadError=Média trop volumineux
-fileNotSupportedError=Format non pris en charge
\ No newline at end of file
+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 6e8ec5f84..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
@@ -55,4 +55,6 @@ commentsLabel=Additional message
 
 importFile=File import
 maxUploadError=Media too large
-fileNotSupportedError=Unsupported format
\ No newline at end of file
+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 78720b514..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
@@ -55,4 +55,6 @@ commentsLabel=Message compl&eacute;mentaire
 
 importFile=Importer un fichier
 maxUploadError=Média trop volumineux
-fileNotSupportedError=Format non pris en charge
\ No newline at end of file
+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/tasks/pages/TasksPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/TasksPage.java
index 166dffa0f..dd61cee14 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
@@ -44,6 +44,7 @@
 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.shared.dto.TaskDTO;
 
 import java.util.ArrayList;
@@ -58,7 +59,7 @@ interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
   private static TasksPageUiBinder uiBinder = GWT.create(TasksPageUiBinder.class);
   private AddTaskButton buttonCreate = new AddTaskButton();
 
-  private DeleteTaskButton buttonDelete = new DeleteTaskButton();
+  private DeleteButton buttonDelete = new DeleteButton();
   @UiField HTMLPanel container;
   @UiField
   UnorderedList list;
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 26a29000b..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
@@ -2,7 +2,6 @@
 
 import org.silverpeas.core.SilverpeasException;
 import org.silverpeas.core.security.authentication.AuthenticationCredential;
-import org.silverpeas.core.security.authentication.AuthenticationResponse;
 import org.silverpeas.core.security.authentication.AuthenticationService;
 import org.silverpeas.core.security.authentication.AuthenticationServiceProvider;
 import org.silverpeas.core.security.session.SessionInfo;
@@ -42,15 +41,13 @@ protected void setMainsessioncontroller(String login, String password, String do
       throws SilverpeasException {
     AuthenticationService authService = AuthenticationServiceProvider.getService();
     AuthenticationCredential credential = AuthenticationCredential.newWithAsLogin(login);
-    AuthenticationResponse response =
+    String response =
         authService.authenticate(credential.withAsPassword(password).withAsDomainId(domainId));
     String key;
     if (response == null) {
       key = null;
-    } else if (response.getStatus().succeeded()) {
-      key = response.getToken();
     } else {
-      key = response.getStatus().getCode();
+      key = response;
     }
     MainSessionController mainSessionController =
         new MainSessionController(key, getHttpRequest().getSession());
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 d6d837dd8..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,12 +37,10 @@
 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.attachment.util.SimpleDocumentList;
-import org.silverpeas.core.contribution.publication.dao.PublicationCriteria;
 import org.silverpeas.core.contribution.publication.model.*;
 import org.silverpeas.core.contribution.publication.service.PublicationService;
 import org.silverpeas.core.io.media.image.thumbnail.ThumbnailSettings;
@@ -50,13 +48,8 @@
 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;
@@ -76,7 +69,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
@@ -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,8 +429,12 @@ 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()));
@@ -647,7 +649,6 @@ public PublicationDTO getNextPublication(@PathParam("appId") String instanceId,
       }
       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)) {
@@ -666,8 +667,7 @@ public PublicationDTO getNextPublication(@PathParam("appId") String instanceId,
           }
         }
       }
-
-
+      
       dto.setId(next.getId());
       dto.setName(next.getName());
       dto.setDescription(next.getDescription());
@@ -681,6 +681,23 @@ public PublicationDTO getNextPublication(@PathParam("appId") String instanceId,
     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/shared/dto/documents/PublicationDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java
index 4c223c998..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,6 +43,10 @@ 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;
@@ -145,4 +149,20 @@ public void setNotAllowedDownloads(List<String> 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/navigation/ApplicationInstanceDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/navigation/ApplicationInstanceDTO.java
index 49d1d5df7..98569dc55 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 isPersonnal() {
+    return personnal;
+  }
+
+  public void setPersonnal(boolean personnal) {
+    this.personnal = personnal;
+  }
 }
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 7bc2263a1..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
@@ -89,4 +89,9 @@ 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/ServiceMyLinks.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMyLinks.java
index 38d7951f6..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,6 +26,7 @@
 
 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;
 
@@ -52,5 +53,9 @@ public interface ServiceMyLinks extends RestService {
   @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);
 
 }

From 4d154957909df272b706069e667568fe8ff87994 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 23 Feb 2024 18:14:15 +0100
Subject: [PATCH 202/228] font size refactoring

---
 .../org/silverpeas/mobile/public/spmobile.css | 40 +++++++++----------
 1 file changed, 18 insertions(+), 22 deletions(-)

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 0b29b5c25..056c7a300 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
@@ -52,7 +52,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
@@ -1002,7 +1002,6 @@ audio::-webkit-media-controls-enclosure {
   color: #848484;
   padding: 1em;
   margin: 0;
-  font-size: 10pt;
 }
 
 .lastUpdate {
@@ -1010,7 +1009,6 @@ audio::-webkit-media-controls-enclosure {
   padding-top: 1em;
   padding-left: 1em;
   margin: 0;
-  font-size: 10pt;
 }
 
 .nbViews {
@@ -1018,7 +1016,6 @@ audio::-webkit-media-controls-enclosure {
   padding-top: 1em;
   padding-left: 1em;
   margin: 0;
-  font-size: 10pt;
   font-style: italic;
 }
 
@@ -1038,7 +1035,7 @@ audio::-webkit-media-controls-enclosure {
 .appHeader {
   padding: 0 1em;
   margin: 0;
-  font-size: 12pt;
+  font-size: 1.2em;
   font-weight: normal;
   height: 3em;
   line-height: 3em;
@@ -1237,7 +1234,7 @@ audio::-webkit-media-controls-enclosure {
 }
 
 #add-comment h3 {
-  font-size: 10pt;
+  font-size: 1em;
   font-weight: normal;
   margin: 0;
   padding: 0;
@@ -1250,13 +1247,13 @@ audio::-webkit-media-controls-enclosure {
 }
 
 #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;
@@ -1458,7 +1455,7 @@ li > #operations {
   line-height: 1.4em;
   position: relative;
   color: #000;
-  font-size: 80%;
+  font-size: 0.8em;
   min-height: 3.4em;
 }
 
@@ -1491,12 +1488,12 @@ li > #operations {
 }
 
 #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;
 }
 
@@ -1515,7 +1512,7 @@ li > #operations {
   padding-left: 1%;
   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 {
@@ -1541,7 +1538,7 @@ input.filter-contacts {
 .list-contacts,
 .list-comments,
 .list-notifications, {
-  font-size: 10pt;
+  font-size: 1em;
   line-height: 1.8em;
 }
 
@@ -1598,7 +1595,7 @@ input.filter-contacts {
 }
 
 #update-statut h2, #send-message h2 {
-  font-size: 13pt;
+  font-size: 1.3em;
   font-weight: normal
 }
 
@@ -1769,7 +1766,7 @@ textarea.ui-input-text {
 
 #page-login #copyright {
   bottom: 1em;
-  font-size: 80%;
+  font-size: 0.8em;
   left: 0;
   position: fixed;
   right: 0;
@@ -1894,7 +1891,7 @@ textarea.ui-input-text {
 }
 
 .liste-news li p, .liste-annonces li p {
-  font-size: 11px;
+  font-size: 0.82em;
   color: #666;
 }
 
@@ -1909,7 +1906,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;
 }
 
@@ -1920,7 +1916,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;
@@ -2272,7 +2268,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),
@@ -2413,8 +2409,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: 1.05em;
+  line-height: 1.2em;
   color: #555;
   text-decoration: none;
   font-weight:500;
@@ -2962,7 +2958,7 @@ a.popin-btn {
 
 #resourcesManager .reservationDate {
 	font-weight: 600;
-	font-size: 11pt;
+	font-size: 1.1em;
 	padding-bottom: 0.5em;
 }
 

From ec6b50a3247f245307eb8af05731f27331793c47 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 23 Feb 2024 18:20:35 +0100
Subject: [PATCH 203/228] font size centralization

---
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

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 056c7a300..0283c1635 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
@@ -39,12 +39,16 @@ 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
 }
 
+input, select, textarea, button, .ui-btn {
+  font-size: 1em;
+}
+
 legend, .ui-input-text input, .ui-input-search input {
   color: inherit;
 }

From 86483e0d6b9a3683e3afd93d1bc2d70aadee5af4 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 26 Feb 2024 18:22:13 +0100
Subject: [PATCH 204/228] Feature #13922

---
 .../org/silverpeas/mobile/client/SpMobil.java |   6 +
 .../client/apps/config/pages/ConfigPage.java  |  26 ++-
 .../apps/config/pages/ConfigPage.ui.xml       |   2 +
 .../favorites/pages/widgets/CategoryItem.java |   5 +-
 .../components/base/NavigationMenu.java       |  18 +-
 .../components/base/NavigationMenu.ui.xml     |  17 +-
 .../resources/ApplicationResources.java       |  15 ++
 .../resources/icons/menu}/inbox.svg           |   0
 .../client/resources/icons/menu/search.svg    |   1 +
 .../client/resources/icons/menu/sharebox.svg  |   1 +
 .../resources/icons/menu/usercalendar.svg}    |   0
 .../org/silverpeas/mobile/public/spmobile.css | 164 ++++++++++--------
 .../shared/dto/configuration/Config.java      |  13 ++
 .../shared/dto/configuration/IConfig.java     |   4 +
 14 files changed, 187 insertions(+), 85 deletions(-)
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public/icons => client/resources/icons/menu}/inbox.svg (100%)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/search.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/sharebox.svg
 rename mobile-war/src/main/java/org/silverpeas/mobile/{public/icons/calendar.svg => client/resources/icons/menu/usercalendar.svg} (100%)

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 918205ae8..29229d97a 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
@@ -152,6 +152,8 @@ public void onModuleLoad() {
     // init connexion supervision
     NetworkHelper.getInstance();
 
+    setFontSize(getConfiguration().getFontSize());
+
     instance = this;
     shortcutAppId = Window.Location.getParameter("shortcutAppId");
     shortcutContentType = Window.Location.getParameter("shortcutContentType");
@@ -584,4 +586,8 @@ public void onAuthenticationError(final AbstractAuthenticationErrorEvent event)
   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;");
+  }
 }
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 80833e570..6d50e6260 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,11 +25,14 @@
 package org.silverpeas.mobile.client.apps.config.pages;
 
 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.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.CheckBox;
 import com.google.gwt.user.client.ui.HTMLPanel;
+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;
@@ -54,11 +57,32 @@ public class ConfigPage extends PageContent implements ConfigPagesEventHandler {
   CheckBox lastPublicationsDisplay, lastEventsDisplay;
   @UiField
   CheckBox favoritesDisplay, shortCutsDisplay, shortCutsToolsDisplay;
+
+  @UiField
+  InputElement fontSize;
+
   private Config config;
   public ConfigPage() {
     initWidget(uiBinder.createAndBindUi(this));
     EventBus.getInstance().addHandler(AbstractConfigPagesEvent.TYPE, this);
     EventBus.getInstance().fireEvent(new LoadConfigEvent());
+    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 +97,6 @@ public void onPreviewNativeEvent(Event.NativePreviewEvent event) {
   public void stop() {
     super.stop();
     EventBus.getInstance().removeHandler(AbstractConfigPagesEvent.TYPE, this);
-
   }
 
   @Override
@@ -94,6 +117,7 @@ private void save() {
     config.setLastEventsDisplay(lastEventsDisplay.getValue());
     config.setShortCutsDisplay(shortCutsDisplay.getValue());
     config.setShortCutsToolsDisplay(shortCutsToolsDisplay.getValue());
+    config.setFontSize(Integer.parseInt(fontSize.getAttribute("value")));
     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 91f03d3c5..5e9c2dcd3 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
@@ -61,6 +61,8 @@
         </a>
       </li>
     </ul>
+    <h3 class="title-bloc-part ui-title">Taille du texte</h3>
+    <input type="range" ui:field="fontSize" class="font-percent-size"></input>
   </g:HTMLPanel>
   </g:HTMLPanel>
 
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
index 4f0d168ee..d2231bbe7 100644
--- 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
@@ -93,12 +93,11 @@ public MyLinkCategoryDTO getData() {
     protected void onClick(ClickEvent event) {
       expanded = !expanded;
       if (expanded) {
-        icon.setInnerHTML(resources.more().getText());
-      } else {
         icon.setInnerHTML(resources.less().getText());
+      } else {
+        icon.setInnerHTML(resources.more().getText());
       }
       for (FavoriteItem item : favorites) {
-        //item.setVisible(expanded);
         if (expanded) {
           item.getElement().addClassName("item-open");
           item.getElement().removeClassName("item-closed");
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 f8b650d5b..e11e592e7 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
@@ -26,6 +26,7 @@
 
 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;
@@ -80,11 +81,14 @@ 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, iconHelp, iconSettings, iconHome, iconLogout;
+  @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;
@@ -120,6 +124,11 @@ public NavigationMenu() {
     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());
+    //searchButton.
 
     EventBus.getInstance().addHandler(AbstractPageEvent.TYPE, this);
   }
@@ -132,6 +141,7 @@ public void setPersonalApps(List<ApplicationInstanceDTO> applicationInstanceDTOS
           app.setLabel(msg.myDocuments());
         }
         NavigationItem item = new NavigationItem();
+        item.getElement().getFirstChildElement().removeClassName("icon-app");//TODO
         item.setData(app);
         listApplications.add(item);
       }
@@ -197,10 +207,10 @@ 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) {
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 0bd6a609a..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
@@ -39,13 +39,22 @@
 
       <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-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-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" />
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 4ef94393d..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
@@ -175,5 +175,20 @@ public interface ApplicationResources extends ClientBundle {
   @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/public/icons/inbox.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/inbox.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/inbox.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/inbox.svg
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/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/public/icons/calendar.svg b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/usercalendar.svg
similarity index 100%
rename from mobile-war/src/main/java/org/silverpeas/mobile/public/icons/calendar.svg
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/resources/icons/menu/usercalendar.svg
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 0283c1635..de2321c8d 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
@@ -609,6 +609,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 .carroussel-news li {
   height: 90px;
   position: relative;
+  overflow: hidden;
 }
 
 .carroussel-news img {
@@ -637,7 +638,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;
@@ -645,7 +646,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;
 }
@@ -675,10 +676,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;
 }
@@ -696,86 +697,106 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   height: 18px;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel, #silverpeas-navmenu-panel #actions-menu {
+#silverpeas-navmenu-panel #navmenu-panel {
   border-top: 1px solid #d3d3d3;
-  list-style-type: none;
-  padding: 0;
   margin: 0;
-}
-
-#silverpeas-navmenu-panel #navmenu-panel li, #silverpeas-navmenu-panel #actions-menu li {
   padding: 0;
-  margin: 0;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li a, #silverpeas-navmenu-panel #actions-menu li a {
-  text-decoration: none;
-  color: #333333;
-  display: block;
-  padding: 0.25em 0 0.5em 32px;
-  font-size: 1.25em;
-  line-height: 1.6em;
-  margin-left: 0.5em;
+#silverpeas-navmenu-panel #navmenu-panel li {
+  list-style-type: none;
+  display: flex;
+  align-items: center;
 }
 
-#actions-menu {
-  position: absolute;
-  bottom: 48px;
-  width: 100%;
-  border: 0;
+#silverpeas-navmenu-panel #navmenu-panel li span {
+  position: relative;
+  display: inline;
+  margin-left: 0.5em;
+  font-size: 1.25em;
 }
 
-#personals-apps {
-  padding: inherit;
-  border-top: 1px solid #d3d3d3;
+#silverpeas-navmenu-panel #navmenu-panel li span svg {
+  height: 2em;
+  width: 2em;
 }
 
-#personals-apps .icon-app {
-  top: auto;
-}
-#personals-apps a {
+#silverpeas-navmenu-panel #navmenu-panel li a {
+  position: relative;
+  display: inline;
   border: none;
+  font-size: 1.25em;
   padding-left: 0.5em;
-  padding-top: 0.5em;
+  color: #333333;
 }
 
-#personals-apps a:after {
-  background: none;
+#actions-menu > :first-child, #navmenu-panel > :first-child, #personals-apps > :first-child {
+  padding-top: 1em;
 }
 
-#actions-menu li {
-  fill: #7eb73b;
+#personals-apps {
+  border-top: 1px solid #d3d3d3;
+  margin: 0;
+  padding: 0;
 }
 
-#actions-menu li span {
-  position: absolute;
-  left: 0.5em;
+#personals-apps li {
+  list-style-type: none;
+  display: flex;
+  align-items: center;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-notificationsbox a {
-  background: transparent url('icons/inbox.svg') no-repeat;
+#personals-apps li span {
+  position: relative;
+  display: inline;
+  margin-left: 0.5em;
+  font-size: 1.25em;
 }
-
-#silverpeas-navmenu-panel #navmenu-panel li#menu-sharesbox a {
-  background: transparent url('icons/share.svg') no-repeat;
+#personals-apps li span svg {
+  height: 2em;
+  width: 2em;
 }
 
-#silverpeas-navmenu-panel #actions-menu li#menu-parameter a {
-
+#personals-apps li a {
+  position: relative;
+  display: inline;
+  border: none;
+  font-size: 1.25em;
+  padding-left: 0.5em;
 }
 
-#silverpeas-navmenu-panel #actions-menu li#menu-home a {
-
+#actions-menu {
+  border-top: 1px solid #d3d3d3 !important;
+  position: absolute;
+  bottom: 48px;
+  width: 100%;
+  border: 0;
+  padding-left: 0.5em;
 }
 
-#silverpeas-navmenu-panel #actions-menu li#menu-logout a {
+#actions-menu li {
+  list-style-type: none;
+  display: flex;
+  align-items: center;
+  fill: #7eb73b;
+}
 
+#actions-menu li span svg {
+  height: 2em;
+  width: 2em;
 }
 
-#silverpeas-navmenu-panel #navmenu-panel li#menu-usercalendar a {
-  background: transparent url('icons/calendar.svg') 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;
 }
@@ -1811,18 +1832,17 @@ 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: 24px;
-  height: 24px;
-  background: url('icons/search.svg') no-repeat;
-  text-indent: -300em;
+.searchButton svg {
+  width: 2em;
+  height: 2em;
   display: inline-block;
   position: absolute;
 }
@@ -1833,14 +1853,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;
 }
@@ -1858,11 +1870,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 {
@@ -2056,7 +2068,7 @@ form .forms .fields > li:nth-child(even) {
 
 #actions {
   position: absolute;
-  right: 0.5em;
+  right: 8px;
   top: 11px;
   filter: invert(1);
   z-index: 9999;
@@ -2068,19 +2080,19 @@ form .forms .fields > li:nth-child(even) {
   width: 16px;
   height: 24px;
   text-indent: -3000px;
-  right: 0.5em;
+  right: 8px;
   background: transparent url("qvf.svg") 0 0 no-repeat;
   outline: none;
   z-index: 999;
-  padding-left: 1em;
-  padding-right: 1em;
+  padding-left: 12px;
+  padding-right: 12px;
 }
 
 #action-bloc {
   border: 0;
   position: absolute;
   top: 37px;
-  right: 0.1em;
+  right: 2px;
   padding: 0;
   margin: 0;
   width: 10em;
@@ -2105,7 +2117,7 @@ form .forms .fields > li:nth-child(even) {
 #actionsList {
   position: absolute;
   top: 11px;
-  right: 4em;
+  right: 50px;
   z-index: 9999;
 }
 
@@ -2138,6 +2150,12 @@ form .forms .fields > li:nth-child(even) {
   padding-left: 1em;
 }
 
+.font-percent-size {
+  margin-left: 1em;
+  margin-bottom: 3em;
+  width: calc(100% - 2em);
+}
+
 .ui-listview.favoris {
   overflow: hidden;
 }
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..b9d074a1b 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,8 @@ public class Config {
   private boolean freeZoneDisplay;
   private boolean freeZoneThinDisplay;
 
+  private int fontSize;
+
   public Config() {
   }
 
@@ -51,6 +53,7 @@ public static Config getDefaultConfig() {
     c.setShortCutsToolsDisplay(true);
     c.setFreeZoneDisplay(true);
     c.setFreeZoneThinDisplay(true);
+    c.setFontSize(10);
     return c;
   }
 
@@ -118,6 +121,14 @@ public void setShortCutsToolsDisplay(final boolean shortCutsToolsDisplay) {
     this.shortCutsToolsDisplay = shortCutsToolsDisplay;
   }
 
+  public int getFontSize() {
+    return fontSize;
+  }
+
+  public void setFontSize(int fontSize) {
+    this.fontSize = fontSize;
+  }
+
   public AutoBean<IConfig> getAutoBean () {
     AutoBean<IConfig> b = LocalStorageHelper.factory.iconfig();
     b.as().setFreeZoneDisplay(isFreeZoneDisplay());
@@ -128,6 +139,7 @@ public AutoBean<IConfig> getAutoBean () {
     b.as().setLastPublicationsDisplay(isLastPublicationsDisplay());
     b.as().setShortCutsDisplay(isShortCutsDisplay());
     b.as().setShortCutsToolsDisplay(isShortCutsToolsDisplay());
+    b.as().setFontSize(getFontSize());
     return b;
   }
 
@@ -141,6 +153,7 @@ 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());
     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..187fac429 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,8 @@ public interface IConfig {
 
   public void setShortCutsToolsDisplay(final boolean shortCutsToolsDisplay);
 
+  public int getFontSize();
+
+  public void setFontSize(int fontSize);
+
 }

From 2a3d81d7877ce960edb19b6915b830b12fc31b69 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 27 Feb 2024 16:09:32 +0100
Subject: [PATCH 205/228] Feature #13922

---
 .../documents/pages/GedNavigationPage.java    |  3 +
 .../documents/pages/GedNavigationPage.ui.xml  |  2 +-
 .../pages/widgets/ShortCutItem.ui.xml         |  2 +-
 .../components/base/NavigationMenu.java       |  4 +-
 .../org/silverpeas/mobile/public/spmobile.css | 69 +++++++++++--------
 5 files changed, 47 insertions(+), 33 deletions(-)

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 079a5d16f..6af09d67c 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,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.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;
@@ -54,6 +55,7 @@ public class GedNavigationPage extends PageContent implements View, GedNavigatio
 
   private DocumentsMessages msg;
 
+  @UiField HTMLPanel container;
   @UiField UnorderedList list;
 
   private TopicDTO root;
@@ -81,6 +83,7 @@ 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);
   }
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 72a5a68b3..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,7 +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">
+  <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/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/components/base/NavigationMenu.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java
index e11e592e7..1ea9c9b01 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
@@ -128,8 +128,6 @@ public NavigationMenu() {
     iconInbox.setInnerHTML(resources.inbox().getText());
     iconShareBox.setInnerHTML(resources.sharebox().getText());
     searchButton.setInnerHTML(resources.search().getText());
-    //searchButton.
-
     EventBus.getInstance().addHandler(AbstractPageEvent.TYPE, this);
   }
 
@@ -141,7 +139,7 @@ public void setPersonalApps(List<ApplicationInstanceDTO> applicationInstanceDTOS
           app.setLabel(msg.myDocuments());
         }
         NavigationItem item = new NavigationItem();
-        item.getElement().getFirstChildElement().removeClassName("icon-app");//TODO
+        item.getElement().getFirstChildElement().removeClassName("icon-app");
         item.setData(app);
         listApplications.add(item);
       }
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 de2321c8d..ffcf6579b 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
@@ -262,7 +262,7 @@ legend, .ui-input-text input, .ui-input-search input {
   background-color: #FFF;
   background-image: url('icons/search.svg');
   background-repeat: no-repeat;
-  width: 92%;
+  width: calc( 100vw - 4em);
   padding-left: 2em;
 }
 
@@ -382,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('icons/calendar_today.svg');
-    background-repeat: no-repeat;
-  background-size: contain;
-	position:absolute;
-	top:0;
-	right:1.25em;
-}
 
 .last-event-bloc .ui-listview .date {
 	float:right;
@@ -503,7 +491,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   border: none;
   height: 36px;
   width: 36px;
-  margin: 3px 0 0 0;
+  margin: 0 0 0 0;
   padding: 0 0 0 0;
   left:0;
 }
@@ -556,7 +544,6 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 .favoris-bloc span {
-  top:0.25em;
   fill : #a9a9a9;
 }
 
@@ -588,8 +575,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;
 }
 
@@ -655,6 +642,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;
@@ -717,8 +713,8 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li span svg {
-  height: 2em;
-  width: 2em;
+  height: 1.5em;
+  width: 1.5em;
 }
 
 #silverpeas-navmenu-panel #navmenu-panel li a {
@@ -734,6 +730,10 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-top: 1em;
 }
 
+#actions-menu > :last-child, #navmenu-panel > :last-child, #personals-apps > :last-child {
+  padding-bottom: 1em;
+}
+
 #personals-apps {
   border-top: 1px solid #d3d3d3;
   margin: 0;
@@ -753,8 +753,8 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   font-size: 1.25em;
 }
 #personals-apps li span svg {
-  height: 2em;
-  width: 2em;
+  height: 1.5em;
+  width: 1.5em;
 }
 
 #personals-apps li a {
@@ -762,7 +762,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   display: inline;
   border: none;
   font-size: 1.25em;
-  padding-left: 0.5em;
+  padding : 0 0 0 0.5em;
 }
 
 #actions-menu {
@@ -782,8 +782,8 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #actions-menu li span svg {
-  height: 2em;
-  width: 2em;
+  height: 1.5em;
+  width: 1.5em;
 }
 
 #actions-menu li a {
@@ -821,9 +821,19 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 /***** NAVIGATION ****/
 
+#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;
-  top: 0.5em;
   left: 0.5em;
   z-index: 2;
 }
@@ -1684,7 +1694,7 @@ input.filter-contacts {
 
 .ui-btn-left, .ui-btn-right {
   position: absolute;
-  top: .24em;
+  top: 5px;
 }
 
 .ui-btn {
@@ -2431,8 +2441,8 @@ a.popin-btn {
 .liste-news li h2 a,
 .forms-list h2,
 .liste-annonces li h2 a {
-  font-size: 1.05em;
-  line-height: 1.2em;
+  font-size: 1em;
+  line-height: 1.1em;
   color: #555;
   text-decoration: none;
   font-weight:500;
@@ -2866,6 +2876,9 @@ a.popin-btn {
 .favorite-desc {
   display: block;
   padding-top: 1em;
+  overflow:hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
 }
 
 

From 2d17908839979a342bb99c02dfbd3c7f78a98daa Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 27 Feb 2024 18:02:27 +0100
Subject: [PATCH 206/228] Feature #13922

---
 .../org/silverpeas/mobile/client/SpMobil.java |  8 +++-
 .../client/apps/config/pages/ConfigPage.java  |  5 +++
 .../apps/config/pages/ConfigPage.ui.xml       | 19 +++++----
 .../apps/config/resources/ConfigMessages.java | 41 +++++++++++++++++++
 .../resources/ConfigMessages.properties       | 32 +++++++++++++++
 .../resources/ConfigMessages_en.properties    | 32 +++++++++++++++
 .../resources/ConfigMessages_fr.properties    | 32 +++++++++++++++
 .../client/apps/navigation/NavigationApp.java |  2 +-
 .../common/PublicationContentHelper.java      |  4 +-
 .../server/services/ServiceNavigation.java    | 23 +++++------
 .../services/rest/ServiceNavigation.java      |  4 +-
 11 files changed, 177 insertions(+), 25 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.properties
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_en.properties
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_fr.properties

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 29229d97a..1e226d9e9 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
@@ -33,6 +33,7 @@
 import com.google.gwt.dom.client.Style;
 import com.google.gwt.event.logical.shared.ResizeEvent;
 import com.google.gwt.event.logical.shared.ResizeHandler;
+import com.google.gwt.i18n.client.NumberFormat;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Cookies;
 import com.google.gwt.user.client.Window;
@@ -302,7 +303,7 @@ public static void displayMainPage() {
 
         @Override
         public void attempt() {
-          ServicesLocator.getServiceNavigation().getHomePageData(null, this);
+          ServicesLocator.getServiceNavigation().getHomePageData(null, SpMobil.getContentZoomLevel(), this);
         }
 
         @Override
@@ -578,6 +579,11 @@ 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()));
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 6d50e6260..b6e746df0 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
@@ -38,6 +38,7 @@
 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.shared.dto.configuration.Config;
@@ -61,8 +62,12 @@ public class ConfigPage extends PageContent implements ConfigPagesEventHandler {
   @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());
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 5e9c2dcd3..a885831bf 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,43 +25,46 @@
 <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="Afficher les outils"></g:CheckBox>
+          <g:CheckBox ui:field="shortCutsToolsDisplay" text="{msg.tools}"></g:CheckBox>
         </a>
       </li>
     </ul>
-    <h3 class="title-bloc-part ui-title">Taille du texte</h3>
+    <h3 class="title-bloc-part ui-title"><ui:text from="{msg.fontSize}"/></h3>
     <input type="range" ui:field="fontSize" class="font-percent-size"></input>
   </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..6647fff42
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.java
@@ -0,0 +1,41 @@
+/*
+ * 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 homePage();
+  String fontSize();
+  String tools();
+  String shortcurts();
+  String favorites();
+
+  String events();
+  String lastPublications();
+  String lastNews();
+
+}
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..a90b1b75b
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages.properties
@@ -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/>.
+#
+
+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
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..b0aa3dd19
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_en.properties
@@ -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/>.
+#
+
+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
\ 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..7fcf045fb
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/resources/ConfigMessages_fr.properties
@@ -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/>.
+#
+
+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
\ No newline at end of file
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 2c57117d6..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
@@ -86,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
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 045a64932..0cfd0d326 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,9 +77,11 @@ 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();
     iframeC.setSrc(url);
-    iframeC.setAttribute("onload", "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';}(this));");
+    iframeC.setAttribute("onload", "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';" +
+            "o.contentWindow.document.body.style='zoom:"+zoom+";'}(this));");
     String s = "border-style: none; width: 100%; overflow: hidden;";
     iframeC.setAttribute("style", s);
     basement.appendChild(iframeC);
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 1b11e503e..b9c88d51a 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
@@ -24,13 +24,10 @@
 
 package org.silverpeas.mobile.server.services;
 
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.IFrameElement;
 import org.apache.commons.lang3.EnumUtils;
 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.kmelia.service.KmeliaService;
 import org.silverpeas.components.quickinfo.model.News;
 import org.silverpeas.core.admin.component.model.ComponentInst;
 import org.silverpeas.core.admin.component.model.ComponentInstLight;
@@ -47,9 +44,9 @@
 import org.silverpeas.core.contribution.publication.service.PublicationService;
 import org.silverpeas.core.mylinks.model.LinkDetail;
 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.kernel.bundle.SettingBundle;
+import org.silverpeas.kernel.util.StringUtil;
+import org.silverpeas.kernel.logging.SilverLogger;
 import org.silverpeas.core.web.look.PublicationHelper;
 import org.silverpeas.core.web.rs.UserPrivilegeValidation;
 import org.silverpeas.core.web.rs.annotation.Authorized;
@@ -189,8 +186,8 @@ 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(request);
@@ -356,6 +353,7 @@ 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) {
@@ -364,12 +362,12 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
                 getSettings().getBoolean("spacehomepage.displayUrlType")) {
           String url = space.getFirstPageExtraParam();
           if (url.startsWith("/") && !url.startsWith("/silverpeas") && !url.startsWith("$")) url = "/silverpeas" + url;
-          String html = getIframe(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);
+          String html = getIframe(url, zoom);
           data.setHtmlFreeZone(html);
         }
       }
@@ -391,9 +389,10 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
     return data;
   }
 
-  private String getIframe(String url) {
+  private String getIframe(String url, String zoom) {
     String style = "border-style: none; width: 100%; overflow: hidden;";
-    String script = "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';}(this));";
+    String script = "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';" +
+            "o.contentWindow.document.body.style='zoom:"+zoom+"';}(this));";
     String html = "<iframe style='" + style + "' src='" + url + "' onload=\"" + script + "\">";
     html += "</iframe>";
     return html;
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 81e1292d3..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
@@ -88,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)

From 72642ce954c4acb22ea8e1bc848877f032ccf858 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 27 Feb 2024 20:25:48 +0100
Subject: [PATCH 207/228] Fix zoom on content

---
 .../mobile/client/common/PublicationContentHelper.java |  9 +++++++--
 .../client/components/homepage/HomePageContent.ui.xml  | 10 +++++-----
 .../java/org/silverpeas/mobile/public/spmobile.css     |  2 +-
 .../mobile/server/services/ServiceNavigation.java      |  9 ++++++---
 4 files changed, 19 insertions(+), 11 deletions(-)

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 0cfd0d326..8a8ee7c8d 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
@@ -79,9 +79,14 @@ 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();
+    iframeC.setAttribute("scrolling", "no");
     iframeC.setSrc(url);
-    iframeC.setAttribute("onload", "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';" +
-            "o.contentWindow.document.body.style='zoom:"+zoom+";'}(this));");
+
+    String script = "o.contentWindow.document.body.style='zoom:" + zoom + "'; ";
+    script += "var h = o.contentWindow.document.body.scrollHeight;";
+    script += "o.style.height=h+'px'; ";
+
+    iframeC.setAttribute("onload", "javascript:(function(o){" + script + "}(this));");
     String s = "border-style: none; width: 100%; overflow: hidden;";
     iframeC.setAttribute("style", s);
     basement.appendChild(iframeC);
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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index ffcf6579b..c1149ae36 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
@@ -441,7 +441,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 }
 
 #navigation-footer a {
-  margin: auto;
+  margin: 12px;
   text-align: center;
   flex: 1;
   transform: scale(1.5);
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 b9c88d51a..3010c747e 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
@@ -391,9 +391,12 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId, @PathPa
 
   private String getIframe(String url, String zoom) {
     String style = "border-style: none; width: 100%; overflow: hidden;";
-    String script = "javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+'px';" +
-            "o.contentWindow.document.body.style='zoom:"+zoom+"';}(this));";
-    String html = "<iframe style='" + style + "' src='" + url + "' onload=\"" + script + "\">";
+
+    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=\"" + script + "\" scrolling='no'>";
     html += "</iframe>";
     return html;
   }

From 5f99d83f8e0e406bc63ce88aef18bccf6137513b Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 28 Feb 2024 17:22:14 +0100
Subject: [PATCH 208/228] Fix kernel package

---
 .../mobile/server/services/ServiceNavigation.java           | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

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 3010c747e..33f063843 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
@@ -44,9 +44,9 @@
 import org.silverpeas.core.contribution.publication.service.PublicationService;
 import org.silverpeas.core.mylinks.model.LinkDetail;
 import org.silverpeas.core.security.token.synchronizer.SynchronizerToken;
-import org.silverpeas.kernel.bundle.SettingBundle;
-import org.silverpeas.kernel.util.StringUtil;
-import org.silverpeas.kernel.logging.SilverLogger;
+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.rs.UserPrivilegeValidation;
 import org.silverpeas.core.web.rs.annotation.Authorized;

From a47fc1b8d16c92b7aea325b486f6546e1367d88b Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 28 Feb 2024 17:57:09 +0100
Subject: [PATCH 209/228] Fix pageweb homepage

---
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css  | 5 +++++
 .../silverpeas/mobile/server/services/ServiceNavigation.java | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

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 c1149ae36..352d1f0c5 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
@@ -2881,6 +2881,11 @@ a.popin-btn {
   text-overflow: ellipsis;
 }
 
+#favoris ul li a {
+  display: flex;
+  align-items: center;
+}
+
 
 
 /********* notification **************/
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 33f063843..4c10ec994 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
@@ -396,7 +396,7 @@ private String getIframe(String url, String zoom) {
     script += "var h = o.contentWindow.document.body.scrollHeight;";
     script += "o.style.height=h+'px'; ";
 
-    String html = "<iframe style='" + style + "' src='" + url + "' onload=\"" + script + "\" scrolling='no'>";
+    String html = "<iframe style='" + style + "' src='" + url + "' onload=\"" + "javascript:(function(o){" + script + "}(this));" + "\" scrolling='no'>";
     html += "</iframe>";
     return html;
   }

From 26a303aeca0a8797b5ab4daa2d5f1477eaab67e2 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 29 Feb 2024 11:50:26 +0100
Subject: [PATCH 210/228] refactoring

---
 .../mobile/client/apps/tasks/TasksPage.java   |  1 -
 .../client/apps/tasks/pages/TasksPage.java    | 14 +++++++--
 .../base/widgets/AddButton.java}              | 29 ++++++++-----------
 .../base/widgets/AddButton.ui.xml}            | 13 ++++-----
 .../org/silverpeas/mobile/public/spmobile.css | 13 ++++++---
 5 files changed, 39 insertions(+), 31 deletions(-)
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/{apps/tasks/pages/widgets/AddTaskButton.java => components/base/widgets/AddButton.java} (67%)
 rename mobile-war/src/main/java/org/silverpeas/mobile/client/{apps/tasks/pages/widgets/AddTaskButton.ui.xml => components/base/widgets/AddButton.ui.xml} (74%)

diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java
index 666ecf5f6..a52e2d936 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java
@@ -36,7 +36,6 @@
 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.AddTaskButton;
 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;
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 dd61cee14..dc84eac63 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
@@ -36,7 +36,6 @@
 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.AddTaskButton;
 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;
@@ -44,6 +43,7 @@
 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;
 
@@ -57,7 +57,7 @@ public class TasksPage extends PageContent implements TasksPagesEventHandler {
 
   interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
   private static TasksPageUiBinder uiBinder = GWT.create(TasksPageUiBinder.class);
-  private AddTaskButton buttonCreate = new AddTaskButton();
+  private AddButton buttonCreate = new AddButton();
 
   private DeleteButton buttonDelete = new DeleteButton();
   @UiField HTMLPanel container;
@@ -71,6 +71,16 @@ public TasksPage() {
     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
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.java
similarity index 67%
rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.java
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.java
index 41753a157..2448b67f0 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.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,34 +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.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 AddTaskButton extends ActionItem {
+public class AddButton extends ActionItem {
 
-  interface AddTaskItemUiBinder extends UiBinder<Widget, AddTaskButton> {
-  }
+  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 AddTaskButton() {
-    msg = GWT.create(TasksMessages.class);
-    setId("add-task");
+  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/apps/tasks/pages/widgets/AddTaskButton.ui.xml b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.ui.xml
similarity index 74%
rename from mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.ui.xml
rename to mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.ui.xml
index c5917f472..8e183de3b 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/pages/widgets/AddTaskButton.ui.xml
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/AddButton.ui.xml
@@ -22,11 +22,10 @@
   ~ 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.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="add-task">
-    <g:Anchor ui:field="link"/>
-  </g:HTMLPanel>
-</ui:UiBinder> 
\ No newline at end of file
+    <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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index 352d1f0c5..904c4e32f 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
@@ -262,8 +262,6 @@ legend, .ui-input-text input, .ui-input-search input {
   background-color: #FFF;
   background-image: url('icons/search.svg');
   background-repeat: no-repeat;
-  width: calc( 100vw - 4em);
-  padding-left: 2em;
 }
 
 .ui-page-theme-a textarea.ui-body-inherit {
@@ -2943,7 +2941,7 @@ a.popin-btn {
 	background-color: #FFF;
 }
 
-#actionsList:has(.delete-action) {
+#actionsList:has(.delete-action), #actionsList:has(.add-action) {
   right: 1em;
 }
 
@@ -2954,6 +2952,13 @@ a.popin-btn {
   background: url('icons/delete.svg') no-repeat;
 }
 
+.add-action {
+  height: 24px;
+  width: 24px;
+  filter: invert(1);
+  background: url('icons/add.svg') no-repeat;
+}
+
 .markAsRead-notification {
   height: 24px;
   width: 24px;
@@ -2961,7 +2966,7 @@ a.popin-btn {
   background: url('icons/mark_read.svg') no-repeat;
 }
 
-.delete-action a, .markAsRead-notification a {
+.add-action a, .delete-action a, .markAsRead-notification a {
   height: 24px;
   width: 24px;
   display: block;

From 9e230c37161d2b7e6976fb1ed47674b0f64e3823 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 1 Mar 2024 16:23:40 +0100
Subject: [PATCH 211/228] Refactoring

---
 .../client/apps/agenda/pages/AgendaPage.java  |  8 ++--
 .../client/apps/documents/DocumentsApp.java   |  2 +-
 .../documents/pages/GedNavigationPage.java    |  9 ++--
 .../client/components/base/ActionsList.java   |  8 ++--
 .../client/components/base/ActionsMenu.java   | 23 +++++++--
 .../components/base/NavigationMenu.java       |  1 +
 .../client/components/base/PageHeader.java    |  2 +
 .../silverpeas/mobile/public/components.css   |  2 +-
 .../org/silverpeas/mobile/public/spmobile.css | 48 +++++++++----------
 .../server/services/ServiceNavigation.java    | 15 +++---
 .../navigation/ApplicationInstanceDTO.java    |  2 +-
 11 files changed, 71 insertions(+), 49 deletions(-)

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 ea71e303c..e271d2145 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
@@ -81,7 +81,7 @@ public class AgendaPage extends PageContent implements AgendaPagesEventHandler {
   @UiField
   SpanElement message;
 
-  private AddToFavoritesButton favorite = new AddToFavoritesButton();
+  private AddToFavoritesButton buttonFavorite = new AddToFavoritesButton();
 
   interface AgendaPageUiBinder extends UiBinder<Widget, AgendaPage> {
   }
@@ -211,8 +211,10 @@ public void onCalendarEventsLoaded(final CalendarLoadedEvent event) {
     } else {
       message.setInnerText(msg.noEvent());
     }
-    addActionMenu(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());
+    }
   }
 
   private CalendarDTO getCalendar(final String calendarId) {
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 973870e06..25ce72168 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
@@ -196,7 +196,7 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) {
       page.setPageTitle(event.getInstance().getLabel());
       page.setInstanceId(event.getInstance().getId());
       page.setTopicId(null);
-      page.setPersonnal(event.getInstance().isPersonnal());
+      page.setPersonnal(event.getInstance().getPersonnal());
       page.show();
     }
   }
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 6af09d67c..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
@@ -61,7 +61,7 @@ public class GedNavigationPage extends PageContent implements View, GedNavigatio
   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();
@@ -121,6 +121,7 @@ public void onLoadedTopics(GedItemsLoadedEvent event) {
             setPageTitle(globalMsg.myDocuments());
           } else {
             setPageTitle(((TopicDTO) dataItem).getName());
+            addActionMenu(buttonFavorite);
           }
           root = (TopicDTO) dataItem;
         } else {
@@ -131,13 +132,11 @@ public void onLoadedTopics(GedItemsLoadedEvent event) {
       }
       dataLoaded = true;
 
-      addActionMenu(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);
       }
 
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
index 1c67a9a6e..4e775e429 100644
--- 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
@@ -51,7 +51,7 @@ public ActionsList() {
         initWidget(uiBinder.createAndBindUi(this));
         listActions.setId("actionList-bloc");
         container.getElement().setId("actionsList");
-        container.getElement().getStyle().setDisplay(Style.Display.NONE);
+        container.getElement().addClassName("empty");
     }
     public boolean isEmpty() {
         return (listActions.getWidgetCount() == 0);
@@ -63,12 +63,12 @@ public void addAction(ActionItem action) {
           if (act.getId().equals(action.getId())) return;
         }
         listActions.add(action);
-        container.getElement().getStyle().setDisplay(Style.Display.BLOCK);
+        container.getElement().removeClassName("empty");
     }
 
     public void clear() {
         listActions.clear();
-        container.getElement().getStyle().setDisplay(Style.Display.NONE);
+        container.getElement().addClassName("empty");
     }
 
     public void removeAction(String id, boolean silently) {
@@ -80,7 +80,7 @@ public void removeAction(String id, boolean silently) {
         }
       }
       if (isEmpty()) {
-        container.getElement().getStyle().setDisplay(Style.Display.NONE);
+          container.getElement().addClassName("empty");
       }
     }
 }
\ 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 91aed772c..38432b7be 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
@@ -49,6 +49,7 @@ interface ActionsMenuUiBinder extends UiBinder<Widget, ActionsMenu> {
 
     private static ActionsMenuUiBinder uiBinder = GWT.create(ActionsMenuUiBinder.class);
 
+    private ActionsList actionsShortcuts;
     @UiField HTMLPanel container;
     @UiField
     UnorderedList listActions;
@@ -59,10 +60,14 @@ 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.getElement().getClassName().equals("closed-qvf-menu")) {
@@ -96,12 +101,12 @@ public void addAction(ActionItem action) {
           if (act.getId().equals(action.getId())) return;
         }
         listActions.add(action);
-        container.getElement().getStyle().setDisplay(Style.Display.BLOCK);
+        show();
     }
 
     public void clear() {
         listActions.clear();
-        container.getElement().getStyle().setDisplay(Style.Display.NONE);
+        hide();
     }
 
     public void removeAction(String id, boolean silently) {
@@ -114,7 +119,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 1ea9c9b01..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
@@ -271,6 +271,7 @@ protected void disconnect(ClickEvent event) {
   @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));
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 252da0279..d48c3a6bd 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,6 +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.Window;
 import com.google.gwt.user.client.ui.*;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.common.navigation.PageHistory;
@@ -65,6 +66,7 @@ public PageHeader() {
     menu.getElement().setId("menu");
     ressources.css().ensureInjected();
     title.setInnerText(ResourcesManager.getLabel("mainpage.title"));
+    actionsMenu.setActionsShortcuts(actionsShortcuts);
   }
 
   public void addActionShortcut(ActionItem action) {
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
index 0f423a3e0..b4627bf57 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/public/components.css
@@ -13,7 +13,7 @@
 }
 
 .checkbox-wrapper label {
-    --size: 50px;
+    --size: 4em;
 
     cursor: pointer;
     width: var(--size);
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 904c4e32f..79507d89c 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
@@ -850,10 +850,6 @@ html .ui-controlgroup-controls .ui-btn-up-c {
   padding-left: 0em;
 }
 
-#actionsList:has(.add-task) {
-  right: 1em;
-}
-
 .add-task {
   height: 24px;
   width: 24px;
@@ -2138,6 +2134,28 @@ form .forms .fields > li:nth-child(even) {
   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;
+}
+
 .config .actuality a {
 
 }
@@ -2941,24 +2959,6 @@ a.popin-btn {
 	background-color: #FFF;
 }
 
-#actionsList:has(.delete-action), #actionsList:has(.add-action) {
-  right: 1em;
-}
-
-.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;
-}
-
 .markAsRead-notification {
   height: 24px;
   width: 24px;
@@ -3085,7 +3085,7 @@ a.popin-btn {
 /**** Cookies information page ****/
 .infosTextContainer {
   background-color: white;
-  height: 25vh;
+  min-height: 25vh;
   padding: 2em;
   margin-left: 1em;
   margin-right: 1em;
@@ -3094,7 +3094,7 @@ a.popin-btn {
 }
 
 .infosText {
-  height: 20vh;
+  min-height: 20vh;
   text-align: justify;
   line-height: 1.2em;
 }
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 4c10ec994..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
@@ -489,8 +489,7 @@ public List<ApplicationInstanceDTO> getPersonnalSpaceContent(@PathParam("userId"
       SpaceInst space = Administration.get().getPersonalSpace(userId);
       List<ApplicationInstanceDTO> apps = new ArrayList<>();
       for (ComponentInst app : space.getAllComponentsInst()) {
-        ApplicationInstanceDTO dto = populate(app);
-        dto.setPersonnal(true);
+        ApplicationInstanceDTO dto = populate(app, true);
         apps.add(dto);
       }
       return apps;
@@ -558,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()));
             }
           }
         }
@@ -606,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);
     }
@@ -663,22 +664,24 @@ private SpaceDTO populate(SpaceInst space) {
 
     return dto;
   }
-  private ApplicationInstanceDTO populate(ComponentInst app) {
+  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/shared/dto/navigation/ApplicationInstanceDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/navigation/ApplicationInstanceDTO.java
index 98569dc55..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
@@ -107,7 +107,7 @@ public void setExtraId(final String extraId) {
   public int getPublicationSharing() { return publicationSharing; }
   public int getFileSharing() { return fileSharing; }
 
-  public boolean isPersonnal() {
+  public boolean getPersonnal() {
     return personnal;
   }
 

From 1db2d4c9ba28be1e8ba43b6a3e43107de1082c9a Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 4 Mar 2024 19:37:38 +0100
Subject: [PATCH 212/228] Feature #14040

---
 .../client/apps/agenda/pages/AgendaPage.java  |  17 ++
 .../apps/agenda/pages/EditEventPage.java      | 169 ++++++++++++++++++
 .../apps/agenda/pages/EditEventPage.ui.xml    |  84 +++++++++
 .../apps/agenda/resources/AgendaMessages.java |   3 +
 .../resources/AgendaMessages.properties       |   4 +-
 .../resources/AgendaMessages_en.properties    |   4 +-
 .../resources/AgendaMessages_fr.properties    |   4 +-
 .../client/apps/tasks/pages/TasksPage.java    |   4 +-
 .../client/components/base/ActionsMenu.java   |  15 +-
 .../org/silverpeas/mobile/public/spmobile.css |  92 ++++++++++
 10 files changed, 386 insertions(+), 10 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.ui.xml

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 e271d2145..10dcf3765 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,8 @@
 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.HTMLPanel;
 import com.google.gwt.user.client.ui.ListBox;
@@ -49,6 +51,7 @@
 import org.silverpeas.mobile.client.common.EventBus;
 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.shared.dto.ContentsTypes;
 import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO;
 import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO;
@@ -82,6 +85,7 @@ public class AgendaPage extends PageContent implements AgendaPagesEventHandler {
   SpanElement message;
 
   private AddToFavoritesButton buttonFavorite = new AddToFavoritesButton();
+  private AddButton buttonCreate = new AddButton();
 
   interface AgendaPageUiBinder extends UiBinder<Widget, AgendaPage> {
   }
@@ -94,6 +98,14 @@ 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.show();
+      }
+    });
   }
 
   public void setCalendars(final List<CalendarDTO> cals) {
@@ -214,6 +226,11 @@ public void onCalendarEventsLoaded(final CalendarLoadedEvent event) {
     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);
     }
   }
 
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..b1ed7a3c7
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.java
@@ -0,0 +1,169 @@
+/*
+ * 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.SpanElement;
+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.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.UserSelectionComponentEventHandler;
+import org.silverpeas.mobile.client.components.userselection.events.components.UsersAndGroupsSelectedEvent;
+import org.silverpeas.mobile.client.resources.ApplicationResources;
+import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO;
+import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO;
+
+import java.util.List;
+
+/**
+ * @author svu
+ */
+public class EditEventPage extends PageContent implements EventPagesEventHandler, 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
+  SpanElement selection;
+
+  @Override
+  public void onUsersAndGroupSelected(UsersAndGroupsSelectedEvent event) {
+    //TODO
+  }
+
+  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", "Titre");
+    description.getElement().setAttribute("placeholder", "Description");
+    description.getElement().setAttribute("rows", "6");
+    startDate.getElement().setAttribute("type", "date");
+    endDate.getElement().setAttribute("type", "date");
+    important.setValue(true);
+    publique.setValue(true);
+    EventBus.getInstance().addHandler(AbstractEventPagesEvent.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("Aucune", "string:NONE");
+    frequency.addItem("Tous les jours", "string:DAY");
+    frequency.addItem("Toutes les semaines", "string:WEEK");
+    frequency.addItem("Tous les mois", "string:MONTH");
+    frequency.addItem("Tous les ans", "string:YEAR");
+
+    selectionButton.getElement().setInnerHTML(resources.peoples().getText() + selectionButton.getElement().getInnerHTML());
+  }
+
+  public void setData(ApplicationInstanceDTO instance, List<CalendarDTO> calendarsDTO) {
+    for (CalendarDTO dto : calendarsDTO) {
+      calendars.addItem(dto.getTitle(), dto.getId());
+    }
+  }
+
+  @UiHandler("submit")
+  protected void save(ClickEvent event) {
+    back();
+  }
+
+  @UiHandler("selectionButton")
+  protected  void onUserSelection(ClickEvent event) {
+    UserSelectionPage page = new UserSelectionPage();
+
+    //page.setPreSelectedIds(ids);
+    //sendEventToGetPossibleUsers(fieldName);
+    page.show();
+  }
+
+  @Override
+  public void onRemindersLoaded(final RemindersLoadedEvent event) { }
+
+  @Override
+  public void onRemindersDeleted(final ReminderDeletedEvent event) {}
+
+  @Override
+  public void onAttachmentLoaded(final AttachmentsLoadedEvent event) {}
+
+  @Override
+  public void onRemindersAdding(final RemindersAddingEvent remindersAddingEvent) {}
+
+  @Override
+  public void onReminderAdded(final ReminderAddedEvent event) {}
+
+  @Override
+  public void onParticipationUpdated(final ParticipationUpdatedEvent event) {}
+
+  @Override
+  public void stop() {
+    EventBus.getInstance().removeHandler(AbstractEventPagesEvent.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..be2d495df
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/EditEventPage.ui.xml
@@ -0,0 +1,84 @@
+<!--
+  ~ 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>Calendrier :</label>
+      <g:ListBox ui:field="calendars"></g:ListBox>
+    </span>
+
+    <g:TextBox ui:field="title" styleName="title"/>
+    <g:CheckBox ui:field="allDay" text="Toute la journée" styleName="allDay" value="true"/>
+
+    <span class="startDate">
+      <label>Début: </label>
+      <g:TextBox ui:field="startDate"/>
+    </span>
+    <span class="endDate">
+      <label>Fin: </label>
+      <g:TextBox ui:field="endDate"/>
+    </span>
+    <g:TextArea ui:field="description" styleName="description"/>
+
+    <span class="priority">
+      <label>Important :</label>
+      <g:RadioButton ui:field="important" name="priority">Oui</g:RadioButton>
+      <g:RadioButton ui:field="notimportant" name="priority">Non</g:RadioButton>
+    </span>
+    <span class="visibility">
+      <label>Visibilité :</label>
+      <g:RadioButton ui:field="publique" name="visibility">Publique</g:RadioButton>
+      <g:RadioButton ui:field="prive" name="visibility">Privé</g:RadioButton>
+    </span>
+
+    <span class="frequency">
+      <label>Récurrence :</label>
+      <g:ListBox ui:field="frequency"></g:ListBox>
+    </span>
+
+    <span class="participants">
+      <label>Participants :</label>
+      <g:Anchor ui:field="selectionButton">
+        <span ui:field="selection" class="selection"></span>
+      </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/resources/AgendaMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/resources/AgendaMessages.java
index d4eccf8d5..48a1d8aee 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
@@ -96,4 +96,7 @@ public interface AgendaMessages extends Messages {
   String noEvent();
 
   String the();
+  String create();
+
+  String newtitleEvent();
 }
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 b50db1a4f..57c5d9ba9 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
@@ -86,4 +86,6 @@ 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
\ 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 038d1d63f..9c40c64d4 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
@@ -86,4 +86,6 @@ 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
\ 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 b50db1a4f..57c5d9ba9 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
@@ -86,4 +86,6 @@ 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
\ No newline at end of file
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 dc84eac63..9b34571cd 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
@@ -116,10 +116,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;
         }
       }
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 38432b7be..d246f9a63 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
@@ -37,6 +37,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;
 
 /**
@@ -77,18 +78,24 @@ protected void showActions(ClickEvent event) {
             listActions.getElement().removeClassName("open-qvf-menu");
             listActions.getElement().addClassName("closed-qvf-menu");
         }
+        enableAllItem(true);
     }
 
     public static void close(Element action) {
-        if (action.getParentElement() != null) {
-            action.getParentElement().removeClassName("open-qvf-menu");
-            action.getParentElement().addClassName("closed-qvf-menu");
-        }
+        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);
+        }
     }
 
     public boolean isEmpty() {
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 79507d89c..c94856645 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
@@ -31,6 +31,7 @@
 html {
   font-size: 100%;
   height: 100%;
+  scrollbar-width: none;
 }
 
 body.ui-panel-wrapper {
@@ -543,6 +544,7 @@ html .ui-controlgroup-controls .ui-btn-up-c {
 
 .favoris-bloc span {
   fill : #a9a9a9;
+  white-space: normal;
 }
 
 .favoris-bloc a {
@@ -2621,6 +2623,96 @@ 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;
+  height: 4em;
+  display: inline-block;
+  width: calc(100vw - 4em);
+  margin-left: 2em;
+  margin-top: 1em;
+  vertical-align: middle;
+}
+
+#eventForm .participants > a .selecection {
+  vertical-align: super;
+}
+
 .termsOfServiceText {
   text-align: center;
   margin-top: 2em;

From 3a20951f049f82a66bf8fbe12e1952369637386b Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 5 Mar 2024 18:55:04 +0100
Subject: [PATCH 213/228] Feature #14040

---
 .../mobile/client/apps/agenda/AgendaApp.java  |  59 ++++++-
 .../events/app/AgendaAppEventHandler.java     |   2 +
 .../agenda/events/app/EventCreateEvent.java   |  48 ++++++
 .../client/apps/agenda/pages/AgendaPage.java  |  14 +-
 .../apps/agenda/pages/EditEventPage.java      | 163 ++++++++++++++++--
 .../apps/agenda/pages/EditEventPage.ui.xml    |   7 +-
 .../formsonline/pages/FormOnlineEditPage.java |   6 +-
 .../components/forms/FieldEditable.java       |   7 +-
 .../userselection/UserSelectionPage.java      |  27 ++-
 .../org/silverpeas/mobile/public/spmobile.css |  16 +-
 .../almanach/CalendarEventCreationDTO.java    | 158 +++++++++++++++++
 .../shared/services/rest/ServiceAlmanach.java |  14 +-
 12 files changed, 476 insertions(+), 45 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/app/EventCreateEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/almanach/CalendarEventCreationDTO.java

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..9747e71c1 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
@@ -31,15 +31,7 @@
 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.app.*;
 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;
@@ -60,7 +52,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 +134,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 +433,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);
+        //TODO
+      }
+    };
+    action.attempt();
+  }
+
   private CalendarEventAttendeeDTO getUserAttendee(final List<CalendarEventAttendeeDTO> attendees) {
     CalendarEventAttendeeDTO attendee = null;
     for (CalendarEventAttendeeDTO attendeeDTO : attendees) {
@@ -448,5 +461,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/agenda/pages/AgendaPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/pages/AgendaPage.java
index 10dcf3765..e6c75b4c2 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
@@ -52,6 +52,7 @@
 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.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;
@@ -87,7 +88,17 @@ public class AgendaPage extends PageContent implements AgendaPagesEventHandler {
   private AddToFavoritesButton buttonFavorite = new AddToFavoritesButton();
   private AddButton buttonCreate = new AddButton();
 
-  interface AgendaPageUiBinder extends UiBinder<Widget, AgendaPage> {
+  private List<BaseDTO> allowedUsersAndGroups;
+
+    public void setAllowedUsersAndGroups(List<BaseDTO> baseDTOS) {
+      this.allowedUsersAndGroups = baseDTOS;
+    }
+
+    public List<BaseDTO> getAllowedUsersAndGroups() {
+      return this.allowedUsersAndGroups;
+    }
+
+    interface AgendaPageUiBinder extends UiBinder<Widget, AgendaPage> {
   }
 
   public AgendaPage() {
@@ -103,6 +114,7 @@ public AgendaPage() {
       public void execute() {
         EditEventPage edit = new EditEventPage();
         edit.setData(getApp().getApplicationInstance(), calendars);
+        edit.setAllowedUsersAndGroups(getAllowedUsersAndGroups());
         edit.show();
       }
     });
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
index b1ed7a3c7..9ddf4ba04 100644
--- 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
@@ -25,7 +25,8 @@
 package org.silverpeas.mobile.client.apps.agenda.pages;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.SpanElement;
+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;
@@ -33,17 +34,25 @@
 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.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.almanach.CalendarDTO;
+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;
 
 /**
@@ -77,11 +86,14 @@ public class EditEventPage extends PageContent implements EventPagesEventHandler
   Anchor submit, selectionButton;
 
   @UiField
-  SpanElement selection;
+  DivElement participantsSelected, icon;
 
-  @Override
-  public void onUsersAndGroupSelected(UsersAndGroupsSelectedEvent event) {
-    //TODO
+  private List<BaseDTO> allowedUsersAndGroups;
+
+  private List<BaseDTO> selectedUsersAndGroups;
+
+  public void setAllowedUsersAndGroups(List<BaseDTO> allowedUsersAndGroups) {
+    this.allowedUsersAndGroups = allowedUsersAndGroups;
   }
 
   interface EditEventPageUiBinder extends UiBinder<Widget, EditEventPage> {
@@ -97,9 +109,11 @@ public EditEventPage() {
     description.getElement().setAttribute("rows", "6");
     startDate.getElement().setAttribute("type", "date");
     endDate.getElement().setAttribute("type", "date");
-    important.setValue(true);
+    notimportant.setValue(true);
     publique.setValue(true);
+    submit.getElement().addClassName("formIncomplete");
     EventBus.getInstance().addHandler(AbstractEventPagesEvent.TYPE, this);
+    EventBus.getInstance().addHandler(AbstractUserSelectionComponentEvent.TYPE, this);
     allDay.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
       @Override
       public void onValueChange(ValueChangeEvent<Boolean> valueChangeEvent) {
@@ -113,13 +127,13 @@ public void onValueChange(ValueChangeEvent<Boolean> valueChangeEvent) {
       }
     });
 
-    frequency.addItem("Aucune", "string:NONE");
-    frequency.addItem("Tous les jours", "string:DAY");
-    frequency.addItem("Toutes les semaines", "string:WEEK");
-    frequency.addItem("Tous les mois", "string:MONTH");
-    frequency.addItem("Tous les ans", "string:YEAR");
+    frequency.addItem("Aucune", "NONE");
+    frequency.addItem("Tous les jours", "DAY");
+    frequency.addItem("Toutes les semaines", "WEEK");
+    frequency.addItem("Tous les mois", "MONTH");
+    frequency.addItem("Tous les ans", "YEAR");
 
-    selectionButton.getElement().setInnerHTML(resources.peoples().getText() + selectionButton.getElement().getInnerHTML());
+    icon.setInnerHTML(resources.peoples().getText());
   }
 
   public void setData(ApplicationInstanceDTO instance, List<CalendarDTO> calendarsDTO) {
@@ -128,18 +142,134 @@ public void setData(ApplicationInstanceDTO instance, List<CalendarDTO> calendars
     }
   }
 
+  @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) {
-    back();
+    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);
+      back(); //TODO : update parent page
+    }
+  }
+
+  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) {
 
-    //page.setPreSelectedIds(ids);
-    //sendEventToGetPossibleUsers(fieldName);
+
+      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
@@ -162,6 +292,7 @@ public void onParticipationUpdated(final ParticipationUpdatedEvent event) {}
 
   @Override
   public void stop() {
+    EventBus.getInstance().removeHandler(AbstractUserSelectionComponentEvent.TYPE, this);
     EventBus.getInstance().removeHandler(AbstractEventPagesEvent.TYPE, this);
     super.stop();
   }
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
index be2d495df..1ddfe3b37 100644
--- 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
@@ -42,11 +42,11 @@
 
     <span class="startDate">
       <label>Début: </label>
-      <g:TextBox ui:field="startDate"/>
+      <g:TextBox ui:field="startDate" stylePrimaryName="formMandatoryField"/>
     </span>
     <span class="endDate">
       <label>Fin: </label>
-      <g:TextBox ui:field="endDate"/>
+      <g:TextBox ui:field="endDate" stylePrimaryName="formMandatoryField"/>
     </span>
     <g:TextArea ui:field="description" styleName="description"/>
 
@@ -69,7 +69,8 @@
     <span class="participants">
       <label>Participants :</label>
       <g:Anchor ui:field="selectionButton">
-        <span ui:field="selection" class="selection"></span>
+        <div ui:field="icon"></div>
+        <div ui:field="participantsSelected" class="selection"></div>
       </g:Anchor>
     </span>
 
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 bccf8c1a1..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
@@ -272,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/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/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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index c94856645..0e55cab0d 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
@@ -2701,7 +2701,7 @@ a.popin-btn {
 
 #eventForm .participants > a {
   background-color: white;
-  height: 4em;
+  min-height: 4em;
   display: inline-block;
   width: calc(100vw - 4em);
   margin-left: 2em;
@@ -2709,10 +2709,20 @@ a.popin-btn {
   vertical-align: middle;
 }
 
-#eventForm .participants > a .selecection {
-  vertical-align: super;
+#eventForm .participants > a .selection {
+  color: #333333;
+}
+
+.formMandatoryField {
+  color: #ec8001;
 }
 
+.formIncomplete {
+  filter: grayscale(1);
+}
+
+
+
 .termsOfServiceText {
   text-align: center;
   margin-top: 2em;
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/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);
+
 }

From 3143bd187b9973ef94862eb07e8934252938bff1 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 5 Mar 2024 18:59:41 +0100
Subject: [PATCH 214/228] Fix code report

---
 .../mobile/client/apps/tasks/TasksPage.java   | 157 ------------------
 1 file changed, 157 deletions(-)
 delete mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java

diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java
deleted file mode 100644
index a52e2d936..000000000
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/tasks/TasksPage.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * 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;
-
-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.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.DeleteButton;
-import org.silverpeas.mobile.shared.dto.TaskDTO;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-/**
- * @author: svu
- */
-public class TasksPage extends PageContent implements TasksPagesEventHandler {
-
-  interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
-  private static TasksPageUiBinder uiBinder = GWT.create(TasksPageUiBinder.class);
-  private AddTaskButton buttonCreate = new AddTaskButton();
-
-  private DeleteButton buttonDelete = new DeleteButton();
-  @UiField HTMLPanel container;
-  @UiField
-  UnorderedList list;
-
-  private TasksMessages msg = GWT.create(TasksMessages .class);
-
-  public TasksPage() {
-    initWidget(uiBinder.createAndBindUi(this));
-    list.getElement().setId("tasks");
-    EventBus.getInstance().fireEvent(new TasksLoadEvent());
-    EventBus.getInstance().addHandler(AbstractTasksPagesEvent.TYPE, this);
-    buttonDelete.setId("delete-task");
-  }
-
-  @Override
-  public void onTaskLoad(final TasksLoadedEvent event) {
-    Notification.activityStop();
-    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);
-      }
-    }
-  }
-
-  @Override
-  public void onTaskCreated(final TaskCreatedEvent taskCreatedEvent) {
-    TaskItem item = new TaskItem();
-    item.setParent(this);
-    item.setData(taskCreatedEvent.getTask());
-    list.add(item);
-  }
-
-  @Override
-  public void onTaskUpdated(TaskUpdatedEvent taskUpdatedEvent) {
-    int i = 0;
-    while (i < list.getWidgetCount()) {
-      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();
-          item.setData(taskUpdatedEvent.getTask());
-          list.add(item);
-          break;
-        }
-      }
-      i++;
-    }
-  }
-
-  @Override
-  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

From 40adb3bdb4d8638ed3790b28eea315a56c891274 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 6 Mar 2024 10:28:48 +0100
Subject: [PATCH 215/228] Fix Bug #14047

---
 .../client/apps/documents/pages/PublicationPage.java      | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

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 db8628b64..e7db4704c 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
@@ -111,14 +111,14 @@ public class PublicationPage extends PageContent
   @Override
   public void onSwipeEnd(SwipeEndEvent event) {
     if (!isVisible()) return;
-    String direction = "left";
+    String direction = "";
     if (event.getDirection() == SwipeEvent.DIRECTION.RIGHT_TO_LEFT) {
       // next
       direction = "right";
-    } else if (event.getDirection() == SwipeEvent.DIRECTION.LEFT_TO_RIGHT) {
+    } /*else if (event.getDirection() == SwipeEvent.DIRECTION.LEFT_TO_RIGHT) {
       // previous
       direction = "left";
-    }
+    }*/
     if (!direction.isEmpty()) {
       EventBus.getInstance().fireEvent(new DocumentsNextPublicationEvent(publication, direction));
     }
@@ -169,6 +169,7 @@ public void setPublicationId(String id, String type) {
 
   @Override
   public void onLoadedPublication(PublicationLoadedEvent event) {
+    if (!isVisible()) return;
     Notification.activityStop();
     attachments.clear();
     setCanImport(event.isCanImport());
@@ -212,6 +213,7 @@ public void execute() {
 
   @Override
   public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEvent event) {
+    if (!isVisible()) return;
     for (SimpleDocumentDTO attachment : event.getAttachments()) {
       if (!publication.getNotAllowedDownloads().isEmpty()) {
         attachment.setDownloadable(true);

From 073bbaeb4959412639d02b1c5216a27478dfd2bf Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 6 Mar 2024 11:52:28 +0100
Subject: [PATCH 216/228] Feature #14040

---
 .../mobile/client/apps/agenda/AgendaApp.java  | 12 +----
 .../pages/AbstractEditEventPagesEvent.java    | 44 +++++++++++++++++++
 .../pages/EditEventPagesEventHandler.java     | 32 ++++++++++++++
 .../agenda/events/pages/EventSavedEvent.java  | 38 ++++++++++++++++
 .../client/apps/agenda/pages/AgendaPage.java  | 25 +++++++----
 .../apps/agenda/pages/EditEventPage.java      | 42 +++++++-----------
 .../apps/agenda/pages/widgets/EventItem.java  |  1 -
 7 files changed, 147 insertions(+), 47 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/AbstractEditEventPagesEvent.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EditEventPagesEventHandler.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EventSavedEvent.java

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 9747e71c1..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,20 +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.*;
-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.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;
@@ -445,7 +437,7 @@ public void attempt() {
       @Override
       public void onSuccess(Method method, CalendarEventDTO event) {
         super.onSuccess(method, event);
-        //TODO
+        EventBus.getInstance().fireEvent(new EventSavedEvent());
       }
     };
     action.attempt();
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/AbstractEditEventPagesEvent.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/AbstractEditEventPagesEvent.java
new file mode 100644
index 000000000..0157c4b01
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/AbstractEditEventPagesEvent.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.apps.agenda.events.pages;
+
+import com.google.gwt.event.shared.GwtEvent;
+
+public abstract class AbstractEditEventPagesEvent extends GwtEvent<EditEventPagesEventHandler> {
+
+  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/agenda/events/pages/EditEventPagesEventHandler.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EditEventPagesEventHandler.java
new file mode 100644
index 000000000..cc8918ede
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/agenda/events/pages/EditEventPagesEventHandler.java
@@ -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/>.
+ */
+
+package org.silverpeas.mobile.client.apps.agenda.events.pages;
+
+import com.google.gwt.event.shared.EventHandler;
+
+public interface EditEventPagesEventHandler extends EventHandler {
+  void onEventSaved(EventSavedEvent event);
+
+}
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 e6c75b4c2..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
@@ -33,7 +33,6 @@
 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.HTMLPanel;
 import com.google.gwt.user.client.ui.ListBox;
@@ -115,9 +114,11 @@ 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) {
@@ -172,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);
+              }
             }
           }
         }
@@ -216,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);
+              }
             }
           }
         }
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
index 9ddf4ba04..619c73135 100644
--- 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
@@ -34,6 +34,8 @@
 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;
@@ -58,7 +60,7 @@
 /**
  * @author svu
  */
-public class EditEventPage extends PageContent implements EventPagesEventHandler, UserSelectionComponentEventHandler {
+public class EditEventPage extends PageContent implements EditEventPagesEventHandler, UserSelectionComponentEventHandler {
   private static EditEventPageUiBinder uiBinder = GWT.create(EditEventPageUiBinder.class);
   private ApplicationResources resources = GWT.create(ApplicationResources.class);
 
@@ -92,10 +94,16 @@ public class EditEventPage extends PageContent implements EventPagesEventHandler
 
   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> {
   }
 
@@ -112,7 +120,7 @@ public EditEventPage() {
     notimportant.setValue(true);
     publique.setValue(true);
     submit.getElement().addClassName("formIncomplete");
-    EventBus.getInstance().addHandler(AbstractEventPagesEvent.TYPE, this);
+    EventBus.getInstance().addHandler(AbstractEditEventPagesEvent.TYPE, this);
     EventBus.getInstance().addHandler(AbstractUserSelectionComponentEvent.TYPE, this);
     allDay.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
       @Override
@@ -186,7 +194,6 @@ protected void save(ClickEvent event) {
       dto.setEventType("CalendarEvent");
       dto.setOccurrenceType("CalendarEventOccurrence");
       dto.setEventId("volatile-" + new Date().getTime());
-
       CalendarDTO calendarDTO = new CalendarDTO();
       calendarDTO.setId(calendars.getSelectedValue());
       dto.setCalendar(calendarDTO);
@@ -215,7 +222,6 @@ protected void save(ClickEvent event) {
       dto.setAttendees(getAttendees());
       EventCreateEvent ev = new EventCreateEvent(dto);
       EventBus.getInstance().fireEvent(ev);
-      back(); //TODO : update parent page
     }
   }
 
@@ -240,8 +246,6 @@ private List<CalendarEventAttendeeDTO> getAttendees() {
   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());
@@ -255,11 +259,9 @@ protected  void onUserSelection(ClickEvent event) {
 
   @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) {
@@ -267,33 +269,19 @@ public void onUsersAndGroupSelected(UsersAndGroupsSelectedEvent event) {
       }
     }
     selectionNames = selectionNames.substring(0, selectionNames.length() - 2);
-
     participantsSelected.setInnerText(selectionNames);
-
   }
 
   @Override
-  public void onRemindersLoaded(final RemindersLoadedEvent event) { }
-
-  @Override
-  public void onRemindersDeleted(final ReminderDeletedEvent event) {}
-
-  @Override
-  public void onAttachmentLoaded(final AttachmentsLoadedEvent event) {}
-
-  @Override
-  public void onRemindersAdding(final RemindersAddingEvent remindersAddingEvent) {}
-
-  @Override
-  public void onReminderAdded(final ReminderAddedEvent event) {}
-
-  @Override
-  public void onParticipationUpdated(final ParticipationUpdatedEvent event) {}
+  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(AbstractEventPagesEvent.TYPE, this);
+    EventBus.getInstance().removeHandler(AbstractEditEventPagesEvent.TYPE, this);
     super.stop();
   }
 
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;

From 6347abf9db80f78767098fb163e6ea66e33b5d93 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 7 Mar 2024 17:02:27 +0100
Subject: [PATCH 217/228] Feature #14046

---
 mobile-configuration/pom.xml                  | 18 ++++++-
 .../mobile/mobileSettings.properties          |  3 ++
 .../org/silverpeas/mobile/client/SpMobil.java | 23 +++++++--
 .../mobile/client/apps/config/ConfigApp.java  | 47 +++++++++++++++++++
 .../common/AuthentificationManager.java       | 24 +++++-----
 .../common/storage/LocalStorageHelper.java    | 25 +++++++---
 .../client/components/base/PageHeader.java    |  1 -
 7 files changed, 115 insertions(+), 26 deletions(-)

diff --git a/mobile-configuration/pom.xml b/mobile-configuration/pom.xml
index 6134753ed..4b56b0924 100644
--- a/mobile-configuration/pom.xml
+++ b/mobile-configuration/pom.xml
@@ -23,14 +23,19 @@
   -->
 <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>
     <artifactId>mobile</artifactId>
-    <version>6.4-JR-SNAPSHOT</version>
+    <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 c7c84ee5a..bc4c4014b 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,3 +1,6 @@
+version=${project.version}
+build.date=${timestamp}
+
 # css skin file url
 styleSheet=
 
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 1e226d9e9..c595fa34d 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
@@ -33,7 +33,6 @@
 import com.google.gwt.dom.client.Style;
 import com.google.gwt.event.logical.shared.ResizeEvent;
 import com.google.gwt.event.logical.shared.ResizeHandler;
-import com.google.gwt.i18n.client.NumberFormat;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Cookies;
 import com.google.gwt.user.client.Window;
@@ -99,7 +98,6 @@
 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.navigation.SpaceDTO;
 import org.silverpeas.mobile.shared.dto.search.ResultDTO;
 import org.silverpeas.mobile.shared.exceptions.AuthenticationException;
 
@@ -150,6 +148,8 @@ public static void setUser(final DetailUserDTO user) {
    */
   public void onModuleLoad() {
     exportNativeFunctions();
+    checkVersion();
+
     // init connexion supervision
     NetworkHelper.getInstance();
 
@@ -234,7 +234,18 @@ 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())) {
@@ -278,7 +289,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());
@@ -383,7 +394,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());
@@ -433,6 +444,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());
@@ -492,6 +504,7 @@ 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();
@@ -568,7 +581,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();
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/common/AuthentificationManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java
index 3e3895d57..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
@@ -75,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,
@@ -96,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());
     }
   }
 
@@ -117,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;
   }
@@ -309,7 +309,7 @@ public void onResponseReceived(final Request request, final Response response) {
         }
         @Override
         public void onError(final Request request, final Throwable throwable) {
-
+          LocalStorageHelper.getInstance().storeBuildDate();
         }
       });
     } catch (RequestException e) {
@@ -317,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
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/base/PageHeader.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/PageHeader.java
index d48c3a6bd..1ea01f5e5 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,7 +30,6 @@
 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.*;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.common.navigation.PageHistory;

From b9585afa65c59c0eb6d939188381b9b2fc55cdc9 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 7 Mar 2024 18:03:56 +0100
Subject: [PATCH 218/228] Fix ghost menu

---
 .../mobile/client/components/base/ActionsMenu.java       | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

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 d246f9a63..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,14 +25,11 @@
 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.Element;
-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.Window;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HTMLPanel;
@@ -74,11 +71,10 @@ protected void showActions(ClickEvent event) {
         if (listActions.getElement().getClassName().equals("closed-qvf-menu")) {
             listActions.getElement().addClassName("open-qvf-menu");
             listActions.getElement().removeClassName("closed-qvf-menu");
+            enableAllItem(true);
         } else {
-            listActions.getElement().removeClassName("open-qvf-menu");
-            listActions.getElement().addClassName("closed-qvf-menu");
+            close();
         }
-        enableAllItem(true);
     }
 
     public static void close(Element action) {
@@ -108,6 +104,7 @@ public void addAction(ActionItem action) {
           if (act.getId().equals(action.getId())) return;
         }
         listActions.add(action);
+        action.setVisible(false);
         show();
     }
 

From 464c303934068ab9851a9920b0e684c31f2bc114 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 8 Mar 2024 16:43:38 +0100
Subject: [PATCH 219/228] enhance cache management

---
 .../mobile/client/pages/connexion/ConnexionPage.java     | 7 ++++++-
 .../mobile/client/pages/connexion/ConnexionPage.ui.xml   | 1 +
 .../mobile/client/resources/ApplicationMessages.java     | 5 ++++-
 .../client/resources/ApplicationMessages_en.properties   | 6 ++++--
 .../client/resources/ApplicationMessages_fr.properties   | 6 ++++--
 .../main/java/org/silverpeas/mobile/public/spmobile.css  | 9 +++++++++
 6 files changed, 28 insertions(+), 6 deletions(-)

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 d4a81fb4c..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,6 +26,7 @@
 
 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;
@@ -69,6 +70,9 @@ public class ConnexionPage extends PageContent {
   @UiField
   InlineHTML labelTooglePasswordView;
 
+  @UiField
+  DivElement version;
+
   public void setAuthenticateError(final AuthenticationException authenticateError) {
     if (authenticateError == null) {
       checkCredentials("init","init");
@@ -105,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
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 78ac985a6..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
@@ -61,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/resources/ApplicationMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java
index 35c210e0b..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
@@ -52,7 +52,7 @@ public interface ApplicationMessages extends Messages {
   @DefaultMessage("Corriger")
   String correctBtnLabel();
 
-  @DefaultMessage("© 2001-2023 <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")
@@ -203,4 +203,7 @@ public interface ApplicationMessages extends Messages {
 
   @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 5fe780552..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
@@ -31,7 +31,7 @@ confirmBtnLabel=Confirm
 cancelBtnLabel=Cancel
 correctBtnLabel=Correct
 
-copyright=© 2001-2023 <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
 
@@ -87,4 +87,6 @@ notfoundError=Ressource not found
 
 share=Share
 
-favoritesWithoutCategory=Others favorites
\ No newline at end of file
+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 3eacdf2f2..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
@@ -32,7 +32,7 @@ confirmBtnLabel=Confirmer
 cancelBtnLabel=Annuler
 correctBtnLabel=Corriger
 
-copyright=© 2001-2023 <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
@@ -92,4 +92,6 @@ notfoundError=Ressource non trouv�e
 
 share=Partager
 
-favoritesWithoutCategory=Autres favoris
\ No newline at end of file
+favoritesWithoutCategory=Autres favoris
+
+version=Version
\ No newline at end of file
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 0e55cab0d..c77db066a 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
@@ -1796,6 +1796,15 @@ textarea.ui-input-text {
 }
 
 #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: 0.8em;
   left: 0;

From 6118f5e019d4132537fc5d1be6fcbea71d920868 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Mon, 11 Mar 2024 17:13:11 +0100
Subject: [PATCH 220/228] Feature #14040

---
 .../apps/agenda/pages/EditEventPage.java      | 14 +++++------
 .../apps/agenda/pages/EditEventPage.ui.xml    | 24 +++++++++----------
 .../apps/agenda/resources/AgendaMessages.java | 23 ++++++++++++++++++
 .../resources/AgendaMessages.properties       | 23 +++++++++++++++++-
 .../resources/AgendaMessages_en.properties    | 23 +++++++++++++++++-
 .../resources/AgendaMessages_fr.properties    | 23 +++++++++++++++++-
 6 files changed, 108 insertions(+), 22 deletions(-)

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
index 619c73135..3f59d10c9 100644
--- 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
@@ -112,8 +112,8 @@ public EditEventPage() {
     setPageTitle(msg.newtitleEvent());
     initWidget(uiBinder.createAndBindUi(this));
     container.getElement().setId("eventForm");
-    title.getElement().setAttribute("placeholder", "Titre");
-    description.getElement().setAttribute("placeholder", "Description");
+    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");
@@ -135,11 +135,11 @@ public void onValueChange(ValueChangeEvent<Boolean> valueChangeEvent) {
       }
     });
 
-    frequency.addItem("Aucune", "NONE");
-    frequency.addItem("Tous les jours", "DAY");
-    frequency.addItem("Toutes les semaines", "WEEK");
-    frequency.addItem("Tous les mois", "MONTH");
-    frequency.addItem("Tous les ans", "YEAR");
+    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());
   }
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
index 1ddfe3b37..10af8a2c4 100644
--- 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
@@ -33,41 +33,41 @@
   <g:HTMLPanel ui:field="container" styleName="content ui-content ui-body-a">
 
     <span class="calendars">
-      <label>Calendrier :</label>
+      <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="Toute la journée" styleName="allDay" value="true"/>
+    <g:CheckBox ui:field="allDay" text="{msg.allDay}" styleName="allDay" value="true"/>
 
     <span class="startDate">
-      <label>Début: </label>
+      <label><ui:text from="{msg.startDate}" /></label>
       <g:TextBox ui:field="startDate" stylePrimaryName="formMandatoryField"/>
     </span>
     <span class="endDate">
-      <label>Fin: </label>
+      <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>Important :</label>
-      <g:RadioButton ui:field="important" name="priority">Oui</g:RadioButton>
-      <g:RadioButton ui:field="notimportant" name="priority">Non</g:RadioButton>
+      <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>Visibilité :</label>
-      <g:RadioButton ui:field="publique" name="visibility">Publique</g:RadioButton>
-      <g:RadioButton ui:field="prive" name="visibility">Privé</g:RadioButton>
+      <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>Récurrence :</label>
+      <label><ui:text from="{msg.frequencyField}" /></label>
       <g:ListBox ui:field="frequency"></g:ListBox>
     </span>
 
     <span class="participants">
-      <label>Participants :</label>
+      <label><ui:text from="{msg.attendeesField}" /></label>
       <g:Anchor ui:field="selectionButton">
         <div ui:field="icon"></div>
         <div ui:field="participantsSelected" class="selection"></div>
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 48a1d8aee..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
@@ -99,4 +99,27 @@ public interface AgendaMessages extends Messages {
   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 57c5d9ba9..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
@@ -88,4 +88,25 @@ sunday=Dimanche
 
 noEvent=Pas d''événements à venir
 create=Créer
-newtitleEvent= Nouvel événement
\ No newline at end of file
+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 9c40c64d4..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
@@ -88,4 +88,25 @@ sunday=Sunday
 
 noEvent=No upcoming events
 create=Create
-newtitleEvent= New event
\ No newline at end of file
+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 57c5d9ba9..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
@@ -88,4 +88,25 @@ sunday=Dimanche
 
 noEvent=Pas d''événements à venir
 create=Créer
-newtitleEvent= Nouvel événement
\ No newline at end of file
+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

From 46e74575a2e44ec4bc88a26b35d7b6b4bc7e6c0e Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Tue, 12 Mar 2024 20:11:01 +0100
Subject: [PATCH 221/228] add filter configuration

---
 .../org/silverpeas/mobile/client/SpMobil.java | 14 ++++
 .../client/apps/config/pages/ConfigPage.java  | 46 +++++++++++++
 .../apps/config/pages/ConfigPage.ui.xml       |  9 +++
 .../apps/config/resources/ConfigMessages.java |  6 ++
 .../resources/ConfigMessages.properties       |  6 ++
 .../resources/ConfigMessages_en.properties    |  8 ++-
 .../resources/ConfigMessages_fr.properties    |  8 ++-
 .../org/silverpeas/mobile/public/spmobile.css |  5 ++
 .../shared/dto/configuration/Config.java      | 69 +++++++++++++++++++
 .../shared/dto/configuration/IConfig.java     | 15 ++++
 10 files changed, 184 insertions(+), 2 deletions(-)

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 c595fa34d..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
@@ -154,6 +154,7 @@ public void onModuleLoad() {
     NetworkHelper.getInstance();
 
     setFontSize(getConfiguration().getFontSize());
+    setFilter(getConfiguration());
 
     instance = this;
     shortcutAppId = Window.Location.getParameter("shortcutAppId");
@@ -609,4 +610,17 @@ public static native void exportNativeFunctions()/*-{
   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/config/pages/ConfigPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/config/pages/ConfigPage.java
index b6e746df0..0237bd6dc 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,13 +25,18 @@
 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;
@@ -41,8 +46,11 @@
 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
  */
@@ -59,6 +67,9 @@ public class ConfigPage extends PageContent implements ConfigPagesEventHandler {
   @UiField
   CheckBox favoritesDisplay, shortCutsDisplay, shortCutsToolsDisplay;
 
+  @UiField
+  RadioButton standard, grayscale, sepia, inverse;
+
   @UiField
   InputElement fontSize;
 
@@ -104,6 +115,33 @@ public void 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
   public void onConfigLoaded(ConfigLoadedEvent event) {
     config = event.getConfig();
@@ -113,6 +151,10 @@ public void onConfigLoaded(ConfigLoadedEvent event) {
     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() {
@@ -123,6 +165,10 @@ private void save() {
     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 a885831bf..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
@@ -66,6 +66,15 @@
     </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
index 6647fff42..e94ae9d61 100644
--- 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
@@ -38,4 +38,10 @@ public interface ConfigMessages extends Messages {
   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
index a90b1b75b..f5c64fc3b 100644
--- 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
@@ -30,3 +30,9 @@ 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
index b0aa3dd19..21c6f7f70 100644
--- 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
@@ -29,4 +29,10 @@ shortcurts=Display shortcuts
 favorites=Display favorites
 events=Display last events
 lastPublications=Display last publications
-lastNews=Display last news
\ No newline at end of file
+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
index 7fcf045fb..daca9892a 100644
--- 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
@@ -29,4 +29,10 @@ 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
\ No newline at end of file
+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/public/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index c77db066a..e668bd33e 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
@@ -2193,6 +2193,11 @@ form .forms .fields > li:nth-child(even) {
   width: calc(100% - 2em);
 }
 
+.filters > span {
+  display: block;
+  margin-left: 1em;
+}
+
 .ui-listview.favoris {
   overflow: hidden;
 }
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 b9d074a1b..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,11 @@ 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() {
@@ -54,6 +59,10 @@ public static Config getDefaultConfig() {
     c.setFreeZoneDisplay(true);
     c.setFreeZoneThinDisplay(true);
     c.setFontSize(10);
+    c.setStandard(true);
+    c.setGrayscale(false);
+    c.setSepia(false);
+    c.setInverse(false);
     return c;
   }
 
@@ -129,6 +138,58 @@ 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());
@@ -140,6 +201,10 @@ public AutoBean<IConfig> getAutoBean () {
     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;
   }
 
@@ -154,6 +219,10 @@ public static Config getBean (AutoBean<IConfig> b) {
     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 187fac429..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
@@ -46,4 +46,19 @@ public interface IConfig {
 
   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();
 }

From 10fff7c2817f0b3828c22071355053eb716b8439 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 13 Mar 2024 10:55:52 +0100
Subject: [PATCH 222/228] add missing label

---
 .../silverpeas/mobile/client/apps/config/pages/ConfigPage.java  | 1 +
 .../mobile/client/apps/config/resources/ConfigMessages.java     | 2 ++
 .../client/apps/config/resources/ConfigMessages.properties      | 1 +
 .../client/apps/config/resources/ConfigMessages_en.properties   | 1 +
 .../client/apps/config/resources/ConfigMessages_fr.properties   | 1 +
 .../silverpeas/mobile/client/apps/tasks/pages/TasksPage.java    | 1 +
 .../mobile/client/apps/tasks/resources/TasksMessages.java       | 1 +
 .../mobile/client/apps/tasks/resources/TasksMessages.properties | 1 +
 .../client/apps/tasks/resources/TasksMessages_en.properties     | 1 +
 .../client/apps/tasks/resources/TasksMessages_fr.properties     | 1 +
 10 files changed, 11 insertions(+)

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 0237bd6dc..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
@@ -82,6 +82,7 @@ public ConfigPage() {
     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");
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
index e94ae9d61..896f49e10 100644
--- 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
@@ -28,6 +28,8 @@
 import com.google.gwt.safehtml.shared.SafeHtml;
 
 public interface ConfigMessages extends Messages {
+
+  String title();
   String homePage();
   String fontSize();
   String tools();
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
index f5c64fc3b..9ddd28f98 100644
--- 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
@@ -22,6 +22,7 @@
 # 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
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
index 21c6f7f70..baefd989f 100644
--- 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
@@ -22,6 +22,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
+title=Settings
 fontSize=Text size
 homePage=Home page
 tools=Display tools
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
index daca9892a..347a889d1 100644
--- 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
@@ -22,6 +22,7 @@
 # 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
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 9b34571cd..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
@@ -68,6 +68,7 @@ interface TasksPageUiBinder extends UiBinder<HTMLPanel, TasksPage> { }
 
   public TasksPage() {
     initWidget(uiBinder.createAndBindUi(this));
+    setPageTitle(msg.title());
     list.getElement().setId("tasks");
     EventBus.getInstance().fireEvent(new TasksLoadEvent());
     EventBus.getInstance().addHandler(AbstractTasksPagesEvent.TYPE, this);
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 eed5d5f93..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,6 +27,7 @@
 import com.google.gwt.i18n.client.Messages;
 
 public interface TasksMessages extends Messages {
+  String title();
   String create();
   String actionCreate();
   String actionEdit();
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 0202fdb34..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,6 +22,7 @@
 # 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
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 ecf0696df..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,6 +22,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
+title=My tasks
 create=Create task
 actionCreate=Create
 actionEdit=Modify
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 ba18574b9..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,6 +22,7 @@
 # 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

From 111370e71c1a1860f4f0a1545cbd21992c55462f Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 14 Mar 2024 10:50:02 +0100
Subject: [PATCH 223/228] Fix #14067

---
 mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java | 1 +
 1 file changed, 1 insertion(+)

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 a982ae4bb..9da23ad1a 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -110,6 +110,7 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
               !url.contains(URLUtil.getApplicationURL() + "/util/") && (!tablet) &&
               !url.contains("attached_file") && !url.contains("Ticket") &&
               !url.contains("LinkFile/Key")  &&
+              !url.contains("Logout")  &&
               !url.contains("FileServer/thumbnail") && redirect) {
         String params = "";
         if (url.contains("Publication")) {

From 06a4f6b66d2e2d5bb04130c59da34ca9a463cdf6 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Thu, 14 Mar 2024 13:07:24 +0100
Subject: [PATCH 224/228] Feature #14068

---
 .../apps/documents/pages/PublicationPage.java | 24 +++++--
 .../mobile/client/common/Html5Utils.java      | 20 +++++-
 .../common/PublicationContentHelper.java      |  1 +
 .../components/base/widgets/SpeakButton.java  | 66 +++++++++++++++++++
 .../base/widgets/SpeakButton.ui.xml           | 31 +++++++++
 .../mobile/public/icons/speaker_phone.svg     |  1 +
 .../silverpeas/mobile/public/icons/stop.svg   |  1 +
 .../org/silverpeas/mobile/public/spmobile.css | 25 ++++++-
 8 files changed, 161 insertions(+), 8 deletions(-)
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.ui.xml
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/speaker_phone.svg
 create mode 100644 mobile-war/src/main/java/org/silverpeas/mobile/public/icons/stop.svg

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 e7db4704c..92785d961 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,15 +25,14 @@
 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.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.Command;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Anchor;
 import com.google.gwt.user.client.ui.FocusPanel;
 import com.google.gwt.user.client.ui.HTMLPanel;
@@ -52,6 +51,7 @@
 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;
@@ -63,6 +63,7 @@
 import org.silverpeas.mobile.client.components.UnorderedList;
 import org.silverpeas.mobile.client.components.attachments.Attachment;
 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;
@@ -100,6 +101,8 @@ 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();
@@ -187,6 +190,19 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
       addActionMenu(share);
     }
 
+    if (publication.getContent()) {
+      speak.setCallback(new Command() {
+        @Override
+        public void execute() {
+          IFrameElement c = IFrameElement.as(Document.get().getElementById("htmlContent"));
+          String mainText = c.getContentDocument().getBody().getInnerText().trim();
+
+          String[] text = {publication.getName(), publication.getDescription(), mainText};
+          Html5Utils.readText(text);
+        }
+      });
+      addActionShortcut(speak);
+    }
     if (Boolean.parseBoolean(ResourcesManager.getParam("content.display.embedded")) && publication.getContent()) {
       PublicationContentHelper.showContent(publication.getId(), publication.getInstanceId(), content);
       contentLink.setVisible(false);
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 5a17bab77..28ef0127a 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,6 +24,7 @@
 
 package org.silverpeas.mobile.client.common;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.user.client.Window;
@@ -130,16 +131,29 @@ public static native JsArray<Voice> getVoices() /*-{
     return window.speechSynthesis.getVoices();
   }-*/;
 
-  public static native void speak(String text) /*-{
+  public static void readText(String[] text) {
+    Html5Utils.cancelSpeaking();
+    for (int i = 0; i < text.length; i++) {
+      String [] sentences = text[i].split("\\.");
+      if (sentences.length==0) speak(text[i]);
+      for (int j = 0; j < sentences.length; j++) {
+        speak(sentences[j]);
+      }
+    }
+  }
+
+  private static native void speak(String text) /*-{
     var msg = new SpeechSynthesisUtterance();
     msg.text = text;
+    msg.addEventListener("end", function (){});
     speechSynthesis.speak(msg);
+
   }-*/;
 
   public static native void cancelSpeaking() /*-{
     speechSynthesis.cancel();
   }-*/;
-  public static native void speak(String text, double volume, double rate, double pitch, String language) /*-{
+  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
@@ -149,7 +163,7 @@ public static native void speak(String text, double volume, double rate, double
         speechSynthesis.speak(msg);
     }-*/;
 
-  public static native void speak(String text, double volume, double rate, double pitch, String language, String desiredVoice) /*-{
+  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) {
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 8a8ee7c8d..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
@@ -79,6 +79,7 @@ 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();
+    iframeC.setId("htmlContent");
     iframeC.setAttribute("scrolling", "no");
     iframeC.setSrc(url);
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java
new file mode 100644
index 000000000..a00cb6ce2
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java
@@ -0,0 +1,66 @@
+/*
+ * 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;
+
+/**
+ * @author: svu
+ */
+public class SpeakButton extends ActionItem {
+
+  interface SpeakButtonUiBinder extends UiBinder<HTMLPanel, SpeakButton> {}
+
+  private static SpeakButtonUiBinder uiBinder = GWT.create(SpeakButtonUiBinder.class);
+
+  @UiField
+  HTMLPanel container;
+  @UiField
+  Anchor link;
+
+  public SpeakButton() {
+    initWidget(uiBinder.createAndBindUi(this));
+    setId("speak");
+  }
+
+  @UiHandler("link")
+  void speak(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/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/spmobile.css b/mobile-war/src/main/java/org/silverpeas/mobile/public/spmobile.css
index e668bd33e..cf8f4c4ec 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
@@ -2167,6 +2167,29 @@ form .forms .fields > li:nth-child(even) {
   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 {
 
 }
@@ -3082,7 +3105,7 @@ a.popin-btn {
   background: url('icons/mark_read.svg') no-repeat;
 }
 
-.add-action a, .delete-action a, .markAsRead-notification a {
+.add-action a, .delete-action a, .markAsRead-notification a, .speak-action a {
   height: 24px;
   width: 24px;
   display: block;

From a1553ebdf691ed4f4c08c6bd4f55ecbab752fa1c Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 15 Mar 2024 12:25:09 +0100
Subject: [PATCH 225/228] Feature #14068

---
 .../mobile/mobileSettings.properties          |  5 ++-
 .../apps/documents/pages/PublicationPage.java | 35 +++++++++++--------
 .../mobile/client/common/Html5Utils.java      | 26 ++++++++++----
 .../components/base/widgets/SpeakButton.java  | 18 +++++++++-
 4 files changed, 60 insertions(+), 24 deletions(-)

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 bc4c4014b..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
@@ -151,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/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 92785d961..79439b9a1 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
@@ -31,8 +31,6 @@
 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.Timer;
-import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Anchor;
 import com.google.gwt.user.client.ui.FocusPanel;
 import com.google.gwt.user.client.ui.HTMLPanel;
@@ -190,19 +188,7 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
       addActionMenu(share);
     }
 
-    if (publication.getContent()) {
-      speak.setCallback(new Command() {
-        @Override
-        public void execute() {
-          IFrameElement c = IFrameElement.as(Document.get().getElementById("htmlContent"));
-          String mainText = c.getContentDocument().getBody().getInnerText().trim();
-
-          String[] text = {publication.getName(), publication.getDescription(), mainText};
-          Html5Utils.readText(text);
-        }
-      });
-      addActionShortcut(speak);
-    }
+    addSpeakingCapacity();
     if (Boolean.parseBoolean(ResourcesManager.getParam("content.display.embedded")) && publication.getContent()) {
       PublicationContentHelper.showContent(publication.getId(), publication.getInstanceId(), content);
       contentLink.setVisible(false);
@@ -227,6 +213,25 @@ public void execute() {
     }
   }
 
+  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);
+    }
+  }
+
   @Override
   public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEvent event) {
     if (!isVisible()) return;
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 28ef0127a..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,10 +24,9 @@
 
 package org.silverpeas.mobile.client.common;
 
-import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.user.client.Window;
+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;
@@ -131,21 +130,34 @@ public static native JsArray<Voice> getVoices() /*-{
     return window.speechSynthesis.getVoices();
   }-*/;
 
-  public static void readText(String[] text) {
+  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) speak(text[i]);
+      if (sentences.length==0) {
+        if (last) {
+          speak(text[i], endCallback);
+        } else {
+          speak(text[i], null);
+        }
+      }
       for (int j = 0; j < sentences.length; j++) {
-        speak(sentences[j]);
+        if (last && j == sentences.length -1) {
+          speak(sentences[j], endCallback);
+        } else {
+          speak(sentences[j], null);
+        }
       }
     }
   }
 
-  private static native void speak(String text) /*-{
+  private static native void speak(String text, Command endCallback) /*-{
     var msg = new SpeechSynthesisUtterance();
     msg.text = text;
-    msg.addEventListener("end", function (){});
+    msg.addEventListener("end", function (event) {
+        if (endCallback != null) endCallback.@com.google.gwt.user.client.Command::execute(*)();
+    });
     speechSynthesis.speak(msg);
 
   }-*/;
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java
index a00cb6ce2..71755d81e 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/widgets/SpeakButton.java
@@ -29,6 +29,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 org.silverpeas.mobile.client.common.Html5Utils;
@@ -39,10 +40,14 @@
  */
 public class SpeakButton extends ActionItem {
 
+
+
   interface SpeakButtonUiBinder extends UiBinder<HTMLPanel, SpeakButton> {}
 
   private static SpeakButtonUiBinder uiBinder = GWT.create(SpeakButtonUiBinder.class);
 
+  private Command onEndSpeaking;
+
   @UiField
   HTMLPanel container;
   @UiField
@@ -51,10 +56,21 @@ interface SpeakButtonUiBinder extends UiBinder<HTMLPanel, SpeakButton> {}
   public SpeakButton() {
     initWidget(uiBinder.createAndBindUi(this));
     setId("speak");
+
+    onEndSpeaking = new Command() {
+      @Override
+      public void execute() {
+        onClick(null);
+      }
+    };
+  }
+
+  public Command getEndCallback() {
+    return onEndSpeaking;
   }
 
   @UiHandler("link")
-  void speak(ClickEvent event) {
+  void onClick(ClickEvent event) {
     if (container.getElement().hasClassName("running")) {
       container.getElement().removeClassName("running");
       Html5Utils.cancelSpeaking();

From 7647993e229b7c030300629c2675f1cb5eb3c6c1 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Fri, 15 Mar 2024 14:34:13 +0100
Subject: [PATCH 226/228] disable browser refresh

---
 .../src/main/java/org/silverpeas/mobile/public/spmobile.css    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

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 cf8f4c4ec..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
@@ -43,7 +43,8 @@ body.ui-panel-wrapper {
 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 {

From af335ce353dd8e9f5c1890f1221ac76f85263a91 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 20 Mar 2024 16:45:30 +0100
Subject: [PATCH 227/228] Fix publication page title

---
 .../mobile/client/apps/documents/DocumentsApp.java           | 3 +--
 .../mobile/client/apps/documents/pages/PublicationPage.java  | 1 +
 .../mobile/client/apps/documents/pages/widgets/GedItem.java  | 5 +++--
 3 files changed, 5 insertions(+), 4 deletions(-)

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 25ce72168..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
@@ -140,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
@@ -175,6 +173,7 @@ public void onSuccess(final Method method, final AttachmentDTO attachement) {
               }
             }
           };
+      action.attempt();
     }
   }
 
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 79439b9a1..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
@@ -266,6 +266,7 @@ public void publishedPublication(PublicationPublishedEvent event) {
   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());
 
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 6f5a1ec64..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
@@ -83,9 +83,10 @@ public void setData(Object data) {
       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");
     }

From 912d3ad79245bd234f0513bcd148fafb85bd4d64 Mon Sep 17 00:00:00 2001
From: svuillet <svu@silvepeas.com>
Date: Wed, 20 Mar 2024 17:37:17 +0100
Subject: [PATCH 228/228] Adjust title page

---
 .../src/main/java/org/silverpeas/bridge/MobilFilter.java  | 8 ++++----
 .../mobile/client/components/base/PageHeader.java         | 7 +++++++
 2 files changed, 11 insertions(+), 4 deletions(-)

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 9da23ad1a..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;
 
@@ -102,7 +102,6 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
       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() + "/media/") &&
@@ -110,7 +109,8 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
               !url.contains(URLUtil.getApplicationURL() + "/util/") && (!tablet) &&
               !url.contains("attached_file") && !url.contains("Ticket") &&
               !url.contains("LinkFile/Key")  &&
-              !url.contains("Logout")  &&
+              !url.contains("Logout") &&
+              !url.contains("FileServer/vignette") &&
               !url.contains("FileServer/thumbnail") && redirect) {
         String params = "";
         if (url.contains("Publication")) {
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 1ea01f5e5..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
@@ -70,10 +70,17 @@ public PageHeader() {
 
   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) {