From 840d468c7620ace6d4fa8312646b99fa97ba63e8 Mon Sep 17 00:00:00 2001 From: Boubaker Khanfir Date: Sun, 29 Sep 2024 04:26:25 +0100 Subject: [PATCH 1/3] feat: Add Space Widgets Portlet Instances - MEED-7451 - Meeds-io/MIPs#151 This change will replace Space Infos portlet by three portlet instances definition in Applications List portlet. --- .../src/main/resources/portlet-instances.json | 42 ++++++++++++++----- .../locale/portlet/LayoutEditor_ar.properties | 2 - .../portlet/LayoutEditor_aro.properties | 2 - .../locale/portlet/LayoutEditor_az.properties | 2 - .../locale/portlet/LayoutEditor_ca.properties | 2 - .../portlet/LayoutEditor_ceb.properties | 2 - .../locale/portlet/LayoutEditor_co.properties | 2 - .../locale/portlet/LayoutEditor_cs.properties | 2 - .../locale/portlet/LayoutEditor_de.properties | 2 - .../locale/portlet/LayoutEditor_el.properties | 2 - .../locale/portlet/LayoutEditor_en.properties | 8 +++- .../portlet/LayoutEditor_es_ES.properties | 2 - .../locale/portlet/LayoutEditor_eu.properties | 2 - .../locale/portlet/LayoutEditor_fa.properties | 2 - .../locale/portlet/LayoutEditor_fi.properties | 2 - .../portlet/LayoutEditor_fil.properties | 2 - .../locale/portlet/LayoutEditor_fr.properties | 2 - .../locale/portlet/LayoutEditor_hi.properties | 2 - .../locale/portlet/LayoutEditor_hu.properties | 2 - .../locale/portlet/LayoutEditor_id.properties | 2 - .../locale/portlet/LayoutEditor_it.properties | 2 - .../locale/portlet/LayoutEditor_ja.properties | 2 - .../locale/portlet/LayoutEditor_ko.properties | 2 - .../locale/portlet/LayoutEditor_lt.properties | 2 - .../locale/portlet/LayoutEditor_ms.properties | 2 - .../locale/portlet/LayoutEditor_nl.properties | 2 - .../locale/portlet/LayoutEditor_no.properties | 2 - .../portlet/LayoutEditor_pcm.properties | 2 - .../locale/portlet/LayoutEditor_pl.properties | 2 - .../portlet/LayoutEditor_pt_BR.properties | 2 - .../portlet/LayoutEditor_pt_PT.properties | 2 - .../locale/portlet/LayoutEditor_ro.properties | 2 - .../locale/portlet/LayoutEditor_ru.properties | 2 - .../locale/portlet/LayoutEditor_sk.properties | 2 - .../locale/portlet/LayoutEditor_sl.properties | 2 - .../locale/portlet/LayoutEditor_sq.properties | 2 - .../portlet/LayoutEditor_sv_SE.properties | 2 - .../locale/portlet/LayoutEditor_th.properties | 2 - .../locale/portlet/LayoutEditor_tl.properties | 2 - .../locale/portlet/LayoutEditor_tr.properties | 2 - .../locale/portlet/LayoutEditor_uk.properties | 2 - .../portlet/LayoutEditor_ur_IN.properties | 2 - .../locale/portlet/LayoutEditor_vi.properties | 2 - .../portlet/LayoutEditor_zh_CN.properties | 2 - .../portlet/LayoutEditor_zh_TW.properties | 2 - 45 files changed, 37 insertions(+), 99 deletions(-) diff --git a/layout-service/src/main/resources/portlet-instances.json b/layout-service/src/main/resources/portlet-instances.json index 29c6321c..024128bf 100644 --- a/layout-service/src/main/resources/portlet-instances.json +++ b/layout-service/src/main/resources/portlet-instances.json @@ -211,22 +211,42 @@ "system":true }, { - "nameId":"SpaceInfos", + "nameId":"SpaceWidgetDescription", "categoryNameId":"spaceTools", - "portletName":"SpaceInfos", + "portletName":"SpaceWidgetDescription", "names":{ - "en":"layout.portletInstance.SpaceInfos.name" + "en":"layout.portletInstance.SpaceWidgetDescription.name" }, "descriptions":{ - "en":"layout.portletInstance.SpaceInfos.description" + "en":"layout.portletInstance.SpaceWidgetDescription.description" }, - "illustrationPath":"war:/../images/portlets/SpaceInfos.webp", - "preferences":[ - - ], - "permissions":[ - "*:/platform/users" - ], + "permissions":["Everyone"], + "system":true + }, + { + "nameId":"SpaceWidgetManagers", + "categoryNameId":"spaceTools", + "portletName":"SpaceWidgetManagers", + "names":{ + "en":"layout.portletInstance.SpaceWidgetManagers.name" + }, + "descriptions":{ + "en":"layout.portletInstance.SpaceWidgetManagers.description" + }, + "permissions":["Everyone"], + "system":true + }, + { + "nameId":"SpaceWidgetMembers", + "categoryNameId":"spaceTools", + "portletName":"SpaceWidgetMembers", + "names":{ + "en":"layout.portletInstance.SpaceWidgetMembers.name" + }, + "descriptions":{ + "en":"layout.portletInstance.SpaceWidgetMembers.description" + }, + "permissions":["Everyone"], "system":true }, { diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ar.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ar.properties index 5c5a1287..a975d6bd 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ar.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ar.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_aro.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_aro.properties index 5c5a1287..a975d6bd 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_aro.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_aro.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_az.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_az.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_az.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_az.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ca.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ca.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ca.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ca.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ceb.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ceb.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ceb.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ceb.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_co.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_co.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_co.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_co.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_cs.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_cs.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_cs.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_cs.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_de.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_de.properties index 09c78a9f..d4b9269e 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_de.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_de.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Personen- & Raumvorschläg layout.portletInstance.SuggestionsPeopleAndSpace.description=Widget, welches vorschlägt, das Netzwerk zu vergrößern (Räume & Personen) layout.portletInstance.SpacesOverview.name=Raumübersicht layout.portletInstance.SpacesOverview.description=Tool : Listet Gastgeberräume, Anfragen, Einladungen -layout.portletInstance.SpaceInfos.name=Rauminformationen -layout.portletInstance.SpaceInfos.description=Widget, welches Administratoren, Autoren und die Beschreibung des Raumes auflistet layout.portletInstance.VerticalMenu.name=Vertikales Menü der Website layout.portletInstance.VerticalMenu.description=Portlet Vertikales Menü der Website layout.portletInstance.Breadcrumb.name=Breadcrumbnavigation diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_el.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_el.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_el.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_el.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_en.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_en.properties index c5a4ebff..e20e6604 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_en.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_en.properties @@ -217,8 +217,12 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space +layout.portletInstance.SpaceWidgetDescription.name=Space Description +layout.portletInstance.SpaceWidgetDescription.description=Gadget displaying the description added from space settings +layout.portletInstance.SpaceWidgetManagers.name=Space Admins List +layout.portletInstance.SpaceWidgetManagers.description=Gadget listing admins of the space +layout.portletInstance.SpaceWidgetMembers.name=Space Members  List +layout.portletInstance.SpaceWidgetMembers.description=Gadget listing the members of the space with ability to open a dedicated drawer layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_es_ES.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_es_ES.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_es_ES.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_es_ES.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_eu.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_eu.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_eu.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_eu.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fa.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fa.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fa.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fa.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fi.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fi.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fi.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fi.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fil.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fil.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fil.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fil.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fr.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fr.properties index a70b28b5..bf280745 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fr.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_fr.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions de personnes e layout.portletInstance.SuggestionsPeopleAndSpace.description=Gadget suggérant de développer le réseau (espaces & personnes) layout.portletInstance.SpacesOverview.name=Aperçu des espaces layout.portletInstance.SpacesOverview.description=Liste des espaces administrés, demandes, invitations -layout.portletInstance.SpaceInfos.name=Informations sur l'espace -layout.portletInstance.SpaceInfos.description=Liste des administrateurs, des rédacteurs et description de l'espace layout.portletInstance.VerticalMenu.name=Menu vertical du site layout.portletInstance.VerticalMenu.description=Portlet Menu vertical du site layout.portletInstance.Breadcrumb.name=Fil d'ariane diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hi.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hi.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hi.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hi.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hu.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hu.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hu.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_hu.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_id.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_id.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_id.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_id.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_it.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_it.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_it.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_it.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ja.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ja.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ja.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ja.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ko.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ko.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ko.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ko.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_lt.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_lt.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_lt.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_lt.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ms.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ms.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ms.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ms.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_nl.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_nl.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_nl.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_nl.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_no.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_no.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_no.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_no.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pcm.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pcm.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pcm.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pcm.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pl.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pl.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pl.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pl.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_BR.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_BR.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_BR.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_BR.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_PT.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_PT.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_PT.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_pt_PT.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ro.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ro.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ro.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ro.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ru.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ru.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ru.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ru.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sk.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sk.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sk.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sk.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sl.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sl.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sl.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sl.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sq.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sq.properties index e8e866e4..e70cc2b7 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sq.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sq.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=crwdns30662:0crwdne30662:0 layout.portletInstance.SuggestionsPeopleAndSpace.description=crwdns30664:0crwdne30664:0 layout.portletInstance.SpacesOverview.name=crwdns30666:0crwdne30666:0 layout.portletInstance.SpacesOverview.description=crwdns30668:0crwdne30668:0 -layout.portletInstance.SpaceInfos.name=crwdns30670:0crwdne30670:0 -layout.portletInstance.SpaceInfos.description=crwdns30672:0crwdne30672:0 layout.portletInstance.VerticalMenu.name=crwdns30674:0crwdne30674:0 layout.portletInstance.VerticalMenu.description=crwdns30676:0crwdne30676:0 layout.portletInstance.Breadcrumb.name=crwdns30678:0crwdne30678:0 diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sv_SE.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sv_SE.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sv_SE.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_sv_SE.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_th.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_th.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_th.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_th.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tl.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tl.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tl.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tl.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tr.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tr.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tr.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_tr.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_uk.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_uk.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_uk.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_uk.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ur_IN.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ur_IN.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ur_IN.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_ur_IN.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_vi.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_vi.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_vi.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_vi.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_CN.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_CN.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_CN.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_CN.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb diff --git a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_TW.properties b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_TW.properties index c5a4ebff..74038dab 100644 --- a/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_TW.properties +++ b/layout-webapp/src/main/resources/locale/portlet/LayoutEditor_zh_TW.properties @@ -217,8 +217,6 @@ layout.portletInstance.SuggestionsPeopleAndSpace.name=Suggestions People & Space layout.portletInstance.SuggestionsPeopleAndSpace.description=A widget that suggests people to connect to layout.portletInstance.SpacesOverview.name=Spaces Overview layout.portletInstance.SpacesOverview.description=A widget that lists administered spaces, requests and invitations -layout.portletInstance.SpaceInfos.name=Space Infos -layout.portletInstance.SpaceInfos.description=A widget that lists admins, content writers, and contains the description of the space layout.portletInstance.VerticalMenu.name=Site Vertical Menu layout.portletInstance.VerticalMenu.description=Site Vertical Menu Portlet layout.portletInstance.Breadcrumb.name=Breadcrumb From 91d7f02f435ef74635b70350a68c2ba2e9c19938 Mon Sep 17 00:00:00 2001 From: Boubaker Khanfir Date: Tue, 1 Oct 2024 15:20:29 +0100 Subject: [PATCH 2/3] feat: Update calls to UserACL to avoid implicit usage of Conversation State in Service Layer - MEED-7555 - Meeds-io/MIPs#151 (#225) This change will update UserACL usage to not implicitly use the current conversation state of authenticated user. --- .../PortletInstanceAttachmentPlugin.java | 2 +- ...tletInstanceCategoryTranslationPlugin.java | 2 +- .../PortletInstanceTranslationPlugin.java | 2 +- .../meeds/layout/rest/model/LayoutModel.java | 8 - .../layout/service/LayoutAclService.java | 141 +++--------------- .../layout/service/PageLayoutService.java | 4 - .../service/PortletInstanceService.java | 6 +- .../storage/PortletInstanceLayoutStorage.java | 4 +- .../PortletInstanceAttachmentPluginTest.java | 2 +- ...InstanceCategoryTranslationPluginTest.java | 2 +- .../PortletInstanceTranslationPluginTest.java | 2 +- .../layout/service/LayoutAclServiceTest.java | 46 +++--- .../webapp/WEB-INF/jsp/siteNavigation.jsp | 4 - .../vue-app/layout-editor/js/LayoutUtils.js | 4 - 14 files changed, 44 insertions(+), 185 deletions(-) diff --git a/layout-service/src/main/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPlugin.java b/layout-service/src/main/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPlugin.java index af5d989c..8c9872d1 100644 --- a/layout-service/src/main/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPlugin.java +++ b/layout-service/src/main/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPlugin.java @@ -77,7 +77,7 @@ public boolean hasAccessPermission(Identity userIdentity, String entityId) throw List permissions = portletInstance.getPermissions(); return CollectionUtils.isEmpty(permissions) || (userIdentity != null - && permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(userIdentity.getUserId(), p))); + && permissions.stream().anyMatch(p -> layoutAclService.hasPermission(userIdentity.getUserId(), p))); } @Override diff --git a/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPlugin.java b/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPlugin.java index 7e16356b..de696d92 100644 --- a/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPlugin.java +++ b/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPlugin.java @@ -76,7 +76,7 @@ public boolean hasAccessPermission(long id, String username) throws ObjectNotFou } List permissions = category.getPermissions(); return CollectionUtils.isEmpty(permissions) - || permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p)); + || permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p)); } @Override diff --git a/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPlugin.java b/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPlugin.java index 39ffa120..4a3b4fc4 100644 --- a/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPlugin.java +++ b/layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPlugin.java @@ -78,7 +78,7 @@ public boolean hasAccessPermission(long id, String username) throws ObjectNotFou } List permissions = portletInstance.getPermissions(); return CollectionUtils.isEmpty(permissions) - || permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p)); + || permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p)); } @Override diff --git a/layout-service/src/main/java/io/meeds/layout/rest/model/LayoutModel.java b/layout-service/src/main/java/io/meeds/layout/rest/model/LayoutModel.java index 1693b04f..4d28257a 100644 --- a/layout-service/src/main/java/io/meeds/layout/rest/model/LayoutModel.java +++ b/layout-service/src/main/java/io/meeds/layout/rest/model/LayoutModel.java @@ -165,10 +165,6 @@ public class LayoutModel { // Specific to container private String profiles; - private String[] moveAppsPermissions; - - private String[] moveContainersPermissions; - private List preferences; private List children; @@ -260,8 +256,6 @@ private void init(ModelObject model) { // NOSONAR this.cssClass = container.getCssClass(); this.profiles = container.getProfiles(); this.accessPermissions = container.getAccessPermissions(); - this.moveAppsPermissions = container.getMoveAppsPermissions(); - this.moveContainersPermissions = container.getMoveContainersPermissions(); this.children = container.getChildren().stream().map(LayoutModel::new).toList(); ApplicationBackgroundStyle appCssStyle = container.getAppBackgroundStyle(); @@ -344,8 +338,6 @@ public static ModelObject toModelObject(LayoutModel layoutModel) { // NOSONAR container.setCssClass(layoutModel.getCssClass()); container.setProfiles(layoutModel.getProfiles()); container.setAccessPermissions(layoutModel.getAccessPermissions()); - container.setMoveAppsPermissions(layoutModel.getMoveAppsPermissions()); - container.setMoveContainersPermissions(layoutModel.getMoveContainersPermissions()); container.setCssStyle(cssStyle); container.setAppBackgroundStyle(mapToAppStyle(layoutModel)); if (layoutModel.getChildren() != null) { diff --git a/layout-service/src/main/java/io/meeds/layout/service/LayoutAclService.java b/layout-service/src/main/java/io/meeds/layout/service/LayoutAclService.java index 5e91ee55..0e36777c 100644 --- a/layout-service/src/main/java/io/meeds/layout/service/LayoutAclService.java +++ b/layout-service/src/main/java/io/meeds/layout/service/LayoutAclService.java @@ -18,61 +18,33 @@ */ package io.meeds.layout.service; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.exoplatform.container.ExoContainerContext; import org.exoplatform.portal.config.UserACL; import org.exoplatform.portal.config.model.Page; import org.exoplatform.portal.config.model.PortalConfig; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.page.PageKey; import org.exoplatform.portal.mop.service.LayoutService; -import org.exoplatform.services.security.Authenticator; import org.exoplatform.services.security.ConversationState; -import org.exoplatform.services.security.Identity; -import org.exoplatform.services.security.IdentityConstants; -import org.exoplatform.services.security.IdentityRegistry; +import org.exoplatform.social.core.identity.model.Identity; import org.exoplatform.social.core.manager.IdentityManager; -import jakarta.annotation.PostConstruct; -import lombok.Setter; -import lombok.SneakyThrows; - @Service public class LayoutAclService { @Autowired - private UserACL userAcl; - - @Autowired - private LayoutService layoutService; + private LayoutService layoutService; @Autowired - private Authenticator authenticator; + private IdentityManager identityManager; @Autowired - private IdentityManager identityManager; - - @Setter - private IdentityRegistry identityRegistry; - - @PostConstruct - public void init() { - // Can't be autowired from Kernel IoC, thus inject it once Spring Bean - // initialized - setIdentityRegistry(ExoContainerContext.getService(IdentityRegistry.class)); - } + private UserACL userAcl; public boolean canAddSite(String username) { - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasCreatePortalPermission(); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return userAcl.hasCreatePortalPermission(userAcl.getUserIdentity(username)); } public boolean canEditSite(SiteKey siteKey, String username) { @@ -80,13 +52,7 @@ public boolean canEditSite(SiteKey siteKey, String username) { if (portalConfig == null) { return false; } - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasEditPermission(portalConfig); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return userAcl.hasEditPermission(portalConfig, userAcl.getUserIdentity(username)); } public boolean canViewSite(SiteKey siteKey, String username) { @@ -94,43 +60,15 @@ public boolean canViewSite(SiteKey siteKey, String username) { if (portalConfig == null) { return false; } - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasPermission(portalConfig); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return userAcl.hasAccessPermission(portalConfig, userAcl.getUserIdentity(username)); } public boolean canEditNavigation(SiteKey siteKey, String username) { - PortalConfig portalConfig = layoutService.getPortalConfig(siteKey); - if (portalConfig == null) { - return false; - } - - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasEditPermission(portalConfig) || userAcl.hasEditPermissionOnNavigation(siteKey); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return canEditSite(siteKey, username); } public boolean canViewNavigation(SiteKey siteKey, PageKey pageKey, String username) { - PortalConfig portalConfig = layoutService.getPortalConfig(siteKey); - if (portalConfig == null) { - return false; - } - Page page = pageKey == null ? null : layoutService.getPage(pageKey); - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasAccessPermission(portalConfig) && (page == null || userAcl.hasPermission(page)); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return canViewSite(siteKey, username) && (pageKey == null || canViewPage(pageKey, username)); } public boolean canViewPage(PageKey pageKey, String username) { @@ -138,14 +76,7 @@ public boolean canViewPage(PageKey pageKey, String username) { if (page == null) { return false; } - - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasPermission(page); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return userAcl.hasAccessPermission(page, userAcl.getUserIdentity(username)); } public boolean canEditPage(PageKey pageKey, String username) { @@ -153,34 +84,15 @@ public boolean canEditPage(PageKey pageKey, String username) { if (page == null) { return false; } - - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasEditPermission(page); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return userAcl.hasEditPermission(page, userAcl.getUserIdentity(username)); } public boolean isAdministrator(String username) { - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.isSuperUser() || userAcl.isUserInGroup(getAdministratorsGroup()); - } finally { - ConversationState.setCurrent(currentConversationState); - } + return userAcl.isAdministrator(userAcl.getUserIdentity(username)); } - public boolean isMemberOf(String username, String expression) { - ConversationState currentConversationState = ConversationState.getCurrent(); - ConversationState.setCurrent(getConversationState(username)); - try { - return userAcl.hasPermission(expression); - } finally { - ConversationState.setCurrent(currentConversationState); - } + public boolean hasPermission(String username, String expression) { + return userAcl.hasPermission(userAcl.getUserIdentity(username), expression); } public String getAdministratorsGroup() { @@ -188,31 +100,12 @@ public String getAdministratorsGroup() { } public ConversationState getSuperUserConversationState() { - return new ConversationState(getUserIdentity(userAcl.getSuperUser())); + return new ConversationState(userAcl.getUserIdentity(userAcl.getSuperUser())); } public long getSuperUserIdentityId() { - org.exoplatform.social.core.identity.model.Identity userIdentity = - identityManager.getOrCreateUserIdentity(userAcl.getSuperUser()); - String id = userIdentity == null ? null : userIdentity.getId(); - return id == null ? 0 : Long.parseLong(id); - } - - private ConversationState getConversationState(String username) { - return new ConversationState(getUserIdentity(username)); - } - - @SneakyThrows - private Identity getUserIdentity(String username) { - if (StringUtils.isBlank(username) || IdentityConstants.ANONIM.equals(username)) { - return null; - } - Identity identity = identityRegistry.getIdentity(username); - if (identity != null) { - return identity; - } else { - return authenticator.createIdentity(username); - } + Identity userIdentity = identityManager.getOrCreateUserIdentity(userAcl.getSuperUser()); + return userIdentity == null ? 0l : Long.parseLong(userIdentity.getId()); } } diff --git a/layout-service/src/main/java/io/meeds/layout/service/PageLayoutService.java b/layout-service/src/main/java/io/meeds/layout/service/PageLayoutService.java index f3006096..ab2dcc75 100644 --- a/layout-service/src/main/java/io/meeds/layout/service/PageLayoutService.java +++ b/layout-service/src/main/java/io/meeds/layout/service/PageLayoutService.java @@ -296,8 +296,6 @@ public void updatePageLink(PageKey pageKey, pageState.getFactoryId(), pageState.getAccessPermissions(), pageState.getEditPermission(), - pageState.getMoveAppsPermissions(), - pageState.getMoveContainersPermissions(), pageState.getType(), link)); layoutService.save(pageContext); @@ -323,8 +321,6 @@ public void updatePagePermissions(PageKey pageKey, pageState.getFactoryId(), accessPermissionsList, editPermission, - pageState.getMoveAppsPermissions(), - pageState.getMoveContainersPermissions(), pageState.getType(), pageState.getLink())); layoutService.save(pageContext); diff --git a/layout-service/src/main/java/io/meeds/layout/service/PortletInstanceService.java b/layout-service/src/main/java/io/meeds/layout/service/PortletInstanceService.java index 3d771c57..35dc2579 100644 --- a/layout-service/src/main/java/io/meeds/layout/service/PortletInstanceService.java +++ b/layout-service/src/main/java/io/meeds/layout/service/PortletInstanceService.java @@ -329,7 +329,7 @@ public List getApplicationPreferences(long applicatio } if (!layoutAclService.isAdministrator(username) && Arrays.stream(application.getAccessPermissions()) - .noneMatch(permission -> layoutAclService.isMemberOf(username, permission))) { + .noneMatch(permission -> layoutAclService.hasPermission(username, permission))) { throw new IllegalAccessException(String.format("Application with id %s access denied", applicationId)); } return getApplicationPreferences(application); @@ -453,13 +453,13 @@ private boolean hasPermission(PortletInstance portletInstance, String username) List permissions = portletInstance.getPermissions(); return CollectionUtils.isEmpty(permissions) || permissions.equals(EVERYONE_PERMISSIONS_LIST) - || (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p))); + || (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p))); } private boolean hasPermission(PortletInstanceCategory category, String username) { List permissions = category.getPermissions(); return CollectionUtils.isEmpty(permissions) || permissions.equals(EVERYONE_PERMISSIONS_LIST) - || (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p))); + || (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p))); } } diff --git a/layout-service/src/main/java/io/meeds/layout/storage/PortletInstanceLayoutStorage.java b/layout-service/src/main/java/io/meeds/layout/storage/PortletInstanceLayoutStorage.java index 25d9aa74..c11bd600 100644 --- a/layout-service/src/main/java/io/meeds/layout/storage/PortletInstanceLayoutStorage.java +++ b/layout-service/src/main/java/io/meeds/layout/storage/PortletInstanceLayoutStorage.java @@ -207,9 +207,7 @@ private Page getPortletInstanceSystemPage() { false, null, Arrays.asList(UserACL.EVERYONE), - page.getEditPermission(), - Arrays.asList(UserACL.EVERYONE), - Arrays.asList(UserACL.EVERYONE)); + page.getEditPermission()); layoutService.save(new PageContext(PORTLET_EDITOR_SYSTEM_PAGE_KEY, pageState), page); page = layoutService.getPage(PORTLET_EDITOR_SYSTEM_PAGE_KEY); } diff --git a/layout-service/src/test/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPluginTest.java b/layout-service/src/test/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPluginTest.java index e0bbbb41..b28dfe25 100644 --- a/layout-service/src/test/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPluginTest.java +++ b/layout-service/src/test/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPluginTest.java @@ -98,7 +98,7 @@ public void hasAccessPermission() { when(portletInstance.getPermissions()).thenReturn(Collections.singletonList(permissionExpression)); assertFalse(attachmentPlugin.hasAccessPermission(userIdentity, "1")); - when(layoutAclService.isMemberOf(username, permissionExpression)).thenReturn(true); + when(layoutAclService.hasPermission(username, permissionExpression)).thenReturn(true); assertTrue(attachmentPlugin.hasAccessPermission(userIdentity, "1")); } diff --git a/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPluginTest.java b/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPluginTest.java index 9eab3a18..cdc4e532 100644 --- a/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPluginTest.java +++ b/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPluginTest.java @@ -91,7 +91,7 @@ public void hasAccessPermission() { when(portletInstanceCategory.getPermissions()).thenReturn(Collections.singletonList(permissionExpression)); assertFalse(translationPlugin.hasAccessPermission(1, username)); - when(layoutAclService.isMemberOf(username, permissionExpression)).thenReturn(true); + when(layoutAclService.hasPermission(username, permissionExpression)).thenReturn(true); assertTrue(translationPlugin.hasAccessPermission(1, username)); } diff --git a/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPluginTest.java b/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPluginTest.java index b387a83f..441798ff 100644 --- a/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPluginTest.java +++ b/layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPluginTest.java @@ -91,7 +91,7 @@ public void hasAccessPermission() { when(portletInstance.getPermissions()).thenReturn(Collections.singletonList(permissionExpression)); assertFalse(translationPlugin.hasAccessPermission(1, username)); - when(layoutAclService.isMemberOf(username, permissionExpression)).thenReturn(true); + when(layoutAclService.hasPermission(username, permissionExpression)).thenReturn(true); assertTrue(translationPlugin.hasAccessPermission(1, username)); } diff --git a/layout-service/src/test/java/io/meeds/layout/service/LayoutAclServiceTest.java b/layout-service/src/test/java/io/meeds/layout/service/LayoutAclServiceTest.java index d4f4c88d..6e05c71f 100644 --- a/layout-service/src/test/java/io/meeds/layout/service/LayoutAclServiceTest.java +++ b/layout-service/src/test/java/io/meeds/layout/service/LayoutAclServiceTest.java @@ -37,8 +37,7 @@ import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.page.PageKey; import org.exoplatform.portal.mop.service.LayoutService; -import org.exoplatform.services.security.Authenticator; -import org.exoplatform.services.security.IdentityRegistry; +import org.exoplatform.services.security.Identity; import org.exoplatform.social.core.manager.IdentityManager; @SpringBootTest(classes = { LayoutAclService.class }) @@ -51,20 +50,14 @@ public class LayoutAclServiceTest { private static final PageKey PAGE_KEY = PageKey.parse("portal::test::test"); - @MockBean - private UserACL userAcl; - @MockBean private LayoutService layoutService; - @MockBean - private Authenticator authenticator; - @MockBean private IdentityManager identityManager; - @Mock - private IdentityRegistry identityRegistry; + @MockBean + private UserACL userAcl; @Autowired private LayoutAclService layoutAclService; @@ -75,15 +68,18 @@ public class LayoutAclServiceTest { @Mock private Page page; + @Mock + private Identity aclIdentity; + @BeforeEach public void setup() { - layoutAclService.setIdentityRegistry(identityRegistry); + when(userAcl.getUserIdentity(TEST_USER)).thenReturn(aclIdentity); } @Test public void canAddSite() { assertFalse(layoutAclService.canAddSite(TEST_USER)); - when(userAcl.hasCreatePortalPermission()).thenReturn(true); + when(userAcl.hasCreatePortalPermission(aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canAddSite(TEST_USER)); } @@ -92,7 +88,7 @@ public void canEditSite() { assertFalse(layoutAclService.canEditSite(SITE_KEY, TEST_USER)); when(layoutService.getPortalConfig(SITE_KEY)).thenReturn(portalConfig); assertFalse(layoutAclService.canEditSite(SITE_KEY, TEST_USER)); - when(userAcl.hasEditPermission(portalConfig)).thenReturn(true); + when(userAcl.hasEditPermission(portalConfig, aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canEditSite(SITE_KEY, TEST_USER)); } @@ -101,7 +97,7 @@ public void canViewSite() { assertFalse(layoutAclService.canViewSite(SITE_KEY, TEST_USER)); when(layoutService.getPortalConfig(SITE_KEY)).thenReturn(portalConfig); assertFalse(layoutAclService.canViewSite(SITE_KEY, TEST_USER)); - when(userAcl.hasPermission(portalConfig)).thenReturn(true); + when(userAcl.hasAccessPermission(portalConfig, aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canViewSite(SITE_KEY, TEST_USER)); } @@ -110,7 +106,7 @@ public void canEditNavigation() { assertFalse(layoutAclService.canEditNavigation(SITE_KEY, TEST_USER)); when(layoutService.getPortalConfig(SITE_KEY)).thenReturn(portalConfig); assertFalse(layoutAclService.canEditNavigation(SITE_KEY, TEST_USER)); - when(userAcl.hasEditPermission(portalConfig)).thenReturn(true); + when(userAcl.hasEditPermission(portalConfig, aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canEditNavigation(SITE_KEY, TEST_USER)); } @@ -119,7 +115,7 @@ public void canViewNavigation() { assertFalse(layoutAclService.canViewNavigation(SITE_KEY, null, TEST_USER)); when(layoutService.getPortalConfig(SITE_KEY)).thenReturn(portalConfig); assertFalse(layoutAclService.canViewNavigation(SITE_KEY, null, TEST_USER)); - when(userAcl.hasAccessPermission(portalConfig)).thenReturn(true); + when(userAcl.hasAccessPermission(portalConfig, aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canViewNavigation(SITE_KEY, null, TEST_USER)); } @@ -128,9 +124,9 @@ public void canViewNavigationWithPage() { when(layoutService.getPortalConfig(SITE_KEY)).thenReturn(portalConfig); when(layoutService.getPage(PAGE_KEY)).thenReturn(page); assertFalse(layoutAclService.canViewNavigation(SITE_KEY, PAGE_KEY, TEST_USER)); - when(userAcl.hasPermission(page)).thenReturn(true); + when(userAcl.hasAccessPermission(page, aclIdentity)).thenReturn(true); assertFalse(layoutAclService.canViewNavigation(SITE_KEY, PAGE_KEY, TEST_USER)); - when(userAcl.hasAccessPermission(portalConfig)).thenReturn(true); + when(userAcl.hasAccessPermission(portalConfig, aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canViewNavigation(SITE_KEY, PAGE_KEY, TEST_USER)); } @@ -139,7 +135,7 @@ public void canViewPage() { assertFalse(layoutAclService.canViewPage(PAGE_KEY, TEST_USER)); when(layoutService.getPage(PAGE_KEY)).thenReturn(page); assertFalse(layoutAclService.canViewPage(PAGE_KEY, TEST_USER)); - when(userAcl.hasPermission(page)).thenReturn(true); + when(userAcl.hasAccessPermission(page, aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canViewPage(PAGE_KEY, TEST_USER)); } @@ -148,22 +144,14 @@ public void canEditPage() { assertFalse(layoutAclService.canEditPage(PAGE_KEY, TEST_USER)); when(layoutService.getPage(PAGE_KEY)).thenReturn(page); assertFalse(layoutAclService.canEditPage(PAGE_KEY, TEST_USER)); - when(userAcl.hasEditPermission(page)).thenReturn(true); + when(userAcl.hasEditPermission(page, aclIdentity)).thenReturn(true); assertTrue(layoutAclService.canEditPage(PAGE_KEY, TEST_USER)); } - @Test - public void isSuperUser() { - assertFalse(layoutAclService.isAdministrator(TEST_USER)); - when(userAcl.isSuperUser()).thenReturn(true); - assertTrue(layoutAclService.isAdministrator(TEST_USER)); - } - @Test public void isAdministrator() { assertFalse(layoutAclService.isAdministrator(TEST_USER)); - when(userAcl.getAdminGroups()).thenReturn("superGroup"); - when(userAcl.isUserInGroup(userAcl.getAdminGroups())).thenReturn(true); + when(userAcl.isAdministrator(aclIdentity)).thenReturn(true); assertTrue(layoutAclService.isAdministrator(TEST_USER)); } diff --git a/layout-webapp/src/main/webapp/WEB-INF/jsp/siteNavigation.jsp b/layout-webapp/src/main/webapp/WEB-INF/jsp/siteNavigation.jsp index 1f20a589..5e6c2e3f 100644 --- a/layout-webapp/src/main/webapp/WEB-INF/jsp/siteNavigation.jsp +++ b/layout-webapp/src/main/webapp/WEB-INF/jsp/siteNavigation.jsp @@ -1,13 +1,9 @@ <%@page import="io.meeds.layout.service.LayoutAclService"%> <%@page import="org.exoplatform.container.ExoContainerContext"%> -<%@page import="org.exoplatform.portal.webui.util.NavigationUtils"%> <%@page import="org.exoplatform.portal.webui.util.Util"%> <%@page import="org.exoplatform.portal.mop.SiteKey"%> -<%@page import="org.exoplatform.portal.mop.user.UserNavigation"%> <% SiteKey siteKey = Util.getUIPortal().getSiteKey(); - UserNavigation userNavigation = NavigationUtils.getUserNavigation(Util.getPortalRequestContext().getUserPortalConfig().getUserPortal(), - siteKey); LayoutAclService aclService = ExoContainerContext.getService(LayoutAclService.class); boolean isAdministrator = aclService.isAdministrator(request.getRemoteUser()); boolean canManageSiteNavigation = aclService.canEditNavigation(siteKey, request.getRemoteUser()); diff --git a/layout-webapp/src/main/webapp/vue-app/layout-editor/js/LayoutUtils.js b/layout-webapp/src/main/webapp/vue-app/layout-editor/js/LayoutUtils.js index b3240b79..f3cc22f7 100644 --- a/layout-webapp/src/main/webapp/vue-app/layout-editor/js/LayoutUtils.js +++ b/layout-webapp/src/main/webapp/vue-app/layout-editor/js/LayoutUtils.js @@ -105,10 +105,6 @@ export const containerModel = { // Generally kept to be accessible to everyone to make // the parent page access permissions applied globally accessPermissions: ['Everyone'], - // Deprecated, not used for containers - moveAppsPermissions: ['Everyone'], - // Deprecated, not used for containers - moveContainersPermissions: ['Everyone'], // List of children which can be of type: // 1. Container // or From cdf3e69502a77ac6f8c7ec3881bfe8878c243232 Mon Sep 17 00:00:00 2001 From: Boubaker Khanfir Date: Wed, 2 Oct 2024 05:25:29 +0100 Subject: [PATCH 3/3] feat: Add Space Widgets Portlet Instance Images - MEED-7557 - Meeds-io/MIPs#151 --- .../injection/PortletInstanceImportService.java | 7 +++---- .../src/main/resources/portlet-instances.json | 3 +++ .../src/main/resources/layout.properties | 1 - .../images/portlets/spaceWidgetDescription.webp | Bin 0 -> 12662 bytes .../images/portlets/spaceWidgetManagers.webp | Bin 0 -> 7693 bytes .../images/portlets/spaceWidgetMembers.webp | Bin 0 -> 6076 bytes 6 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 layout-webapp/src/main/webapp/images/portlets/spaceWidgetDescription.webp create mode 100644 layout-webapp/src/main/webapp/images/portlets/spaceWidgetManagers.webp create mode 100644 layout-webapp/src/main/webapp/images/portlets/spaceWidgetMembers.webp diff --git a/layout-service/src/main/java/io/meeds/layout/service/injection/PortletInstanceImportService.java b/layout-service/src/main/java/io/meeds/layout/service/injection/PortletInstanceImportService.java index 2480af84..3f18b823 100644 --- a/layout-service/src/main/java/io/meeds/layout/service/injection/PortletInstanceImportService.java +++ b/layout-service/src/main/java/io/meeds/layout/service/injection/PortletInstanceImportService.java @@ -114,7 +114,7 @@ public class PortletInstanceImportService { @Value("${meeds.portlets.import.override:false}") private boolean forceReimport; - @Value("${meeds.portlets.import.version:2}") + @Value("${meeds.portlets.import.version:4}") private long portletInstanceImportVersion; @PostConstruct @@ -124,11 +124,10 @@ public void init() { @ContainerTransactional public void importPortletInstances() { - LOG.info("Importing Portlet instances"); - if (!forceReimport - && getSettingValue(PORTLET_INSTANCE_VERSION) != portletInstanceImportVersion) { + if (!forceReimport && getSettingValue(PORTLET_INSTANCE_VERSION) != portletInstanceImportVersion) { forceReimport = true; } + LOG.info("Importing Portlet instances with version {}, force reimport = {}", portletInstanceImportVersion, forceReimport); ConversationState.setCurrent(layoutAclService.getSuperUserConversationState()); try { diff --git a/layout-service/src/main/resources/portlet-instances.json b/layout-service/src/main/resources/portlet-instances.json index 024128bf..8bc40b1d 100644 --- a/layout-service/src/main/resources/portlet-instances.json +++ b/layout-service/src/main/resources/portlet-instances.json @@ -220,6 +220,7 @@ "descriptions":{ "en":"layout.portletInstance.SpaceWidgetDescription.description" }, + "illustrationPath":"war:/../images/portlets/spaceWidgetDescription.webp", "permissions":["Everyone"], "system":true }, @@ -233,6 +234,7 @@ "descriptions":{ "en":"layout.portletInstance.SpaceWidgetManagers.description" }, + "illustrationPath":"war:/../images/portlets/spaceWidgetManagers.webp", "permissions":["Everyone"], "system":true }, @@ -246,6 +248,7 @@ "descriptions":{ "en":"layout.portletInstance.SpaceWidgetMembers.description" }, + "illustrationPath":"war:/../images/portlets/spaceWidgetMembers.webp", "permissions":["Everyone"], "system":true }, diff --git a/layout-webapp/src/main/resources/layout.properties b/layout-webapp/src/main/resources/layout.properties index 117e7a56..40f614ee 100644 --- a/layout-webapp/src/main/resources/layout.properties +++ b/layout-webapp/src/main/resources/layout.properties @@ -18,4 +18,3 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. spring.liquibase.change-log=classpath:changelog/layout-rdbms.db.changelog-master.xml -meeds.portlets.import.version=3 diff --git a/layout-webapp/src/main/webapp/images/portlets/spaceWidgetDescription.webp b/layout-webapp/src/main/webapp/images/portlets/spaceWidgetDescription.webp new file mode 100644 index 0000000000000000000000000000000000000000..208ef74f92475e66f6afa036d4df5434b75f0704 GIT binary patch literal 12662 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�H=9(XVuqP?1{hZQ6xeR&gw7Qf330S+{N){ANC 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 literal 0 HcmV?d00001 diff --git a/layout-webapp/src/main/webapp/images/portlets/spaceWidgetManagers.webp b/layout-webapp/src/main/webapp/images/portlets/spaceWidgetManagers.webp new file mode 100644 index 0000000000000000000000000000000000000000..fe773ec1e8ba4e9b2907990553526d2454616ae2 GIT binary patch literal 7693 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 K!b@aK{Qd_c8Jx`k literal 0 HcmV?d00001