From 10d2b0091297c39aef9cde69c34c334005ed30a7 Mon Sep 17 00:00:00 2001 From: Jeroen Dalsem Date: Thu, 1 Aug 2024 09:58:26 +0200 Subject: [PATCH 1/4] added: widget page manager can now edit page on the front end --- actions/widget_manager/widget_page.php | 17 +++++++++++--- classes/ColdTrick/WidgetManager/Access.php | 18 +++++++++++++++ elgg-plugin.php | 9 +++++--- languages/en.php | 4 +++- languages/nl.php | 4 +++- .../forms/widget_manager/widget_page.php | 22 +++++++++++++------ .../resources/widget_manager/widget_page.php | 8 ++++--- 7 files changed, 64 insertions(+), 18 deletions(-) diff --git a/actions/widget_manager/widget_page.php b/actions/widget_manager/widget_page.php index bf50ba1..e5f10ae 100644 --- a/actions/widget_manager/widget_page.php +++ b/actions/widget_manager/widget_page.php @@ -1,23 +1,34 @@ canEdit()) { + return elgg_error_response(elgg_echo('actionunauthorized')); } } $url = get_input('url'); -if (empty($url)) { +if (empty($url) && !($entity instanceof \WidgetPage && !elgg_is_admin_logged_in())) { return elgg_error_response(elgg_echo('error:missing_data')); } -if (!isset($entity)) { +if (!$entity instanceof \WidgetPage) { + if (!elgg_is_admin_logged_in()) { + return elgg_error_response(elgg_echo('actionunauthorized')); + } + $entity = new \WidgetPage(); } -$entity->url = $url; +if (elgg_is_admin_logged_in()) { + $entity->url = $url; +} + $entity->title = get_input('title'); $entity->description = get_input('description'); $entity->show_description = (bool) get_input('show_description'); diff --git a/classes/ColdTrick/WidgetManager/Access.php b/classes/ColdTrick/WidgetManager/Access.php index b6f09ed..93d4a97 100644 --- a/classes/ColdTrick/WidgetManager/Access.php +++ b/classes/ColdTrick/WidgetManager/Access.php @@ -212,4 +212,22 @@ public static function moreRightsForWidgetManager(\Elgg\Event $event) { } } } + + /** + * Only allow widget page delete by admins + * + * @param \Elgg\Event $event 'permissions_check:delete', 'object' + * + * @return boolean + */ + public static function onlyAdminsCanDeleteWidgetPages(\Elgg\Event $event) { + $user = $event->getUserParam(); + $entity = $event->getEntityParam(); + + if (!$user instanceof \ElggUser || !$entity instanceof \WidgetPage) { + return; + } + + return $user->isAdmin(); + } } diff --git a/elgg-plugin.php b/elgg-plugin.php index 85eefce..eea5a9b 100644 --- a/elgg-plugin.php +++ b/elgg-plugin.php @@ -69,9 +69,7 @@ 'widget_manager/manage_widgets' => [ 'access' => 'admin', ], - 'widget_manager/widget_page' => [ - 'access' => 'admin', - ], + 'widget_manager/widget_page' => [], 'widget_manager/cleanup' => [ 'access' => 'admin', ], @@ -172,6 +170,11 @@ '\ColdTrick\WidgetManager\Widgets::layoutPermissionsCheck' => [], ], ], + 'permissions_check:delete' => [ + 'object' => [ + '\ColdTrick\WidgetManager\Access::onlyAdminsCanDeleteWidgetPages' => [], + ], + ], 'register' => [ 'menu:admin_header' => [ '\ColdTrick\WidgetManager\Menus::registerAdminHeaderMenu' => [], diff --git a/languages/en.php b/languages/en.php index d58ca09..7b3d6e5 100644 --- a/languages/en.php +++ b/languages/en.php @@ -69,7 +69,9 @@ 'widget_manager:settings:extra_contexts:description' => "Enter the page handler name of the new page which will get a layout similar to the index page. You can add as much pages as you need. Be sure not to add a page handler that is already in use. You can also configure the column layout for that page and optionally assign non-admin users as manager of the page.", 'widget_manager:settings:extra_contexts:page' => "Page", 'widget_manager:settings:extra_contexts:layout' => "Layout", - 'widget_manager:settings:extra_contexts:manager' => "Manager", + 'widget_manager:settings:extra_contexts:layout:help' => "Set the number of columns", + 'widget_manager:settings:extra_contexts:manager' => "Managers", + 'widget_manager:settings:extra_contexts:manager:help' => "Configure the users that are allowed to manage the page", 'widget_manager:settings:lazy_loading:enabled' => "Enable Lazy Loading", 'widget_manager:settings:lazy_loading:enabled:help' => "Globally enables the lazy loading feature", diff --git a/languages/nl.php b/languages/nl.php index c31d449..c6fc8d8 100644 --- a/languages/nl.php +++ b/languages/nl.php @@ -49,7 +49,9 @@ 'widget_manager:settings:group:force_tool_widgets:confirm' => 'Weet je het zeker? Dit zal widgets toevoegen/verwijderen die beheerd worden door een groep tool optie (voor de groepen waar widget management is ingeschakeld)', 'widget_manager:settings:extra_contexts:page' => 'Pagina', 'widget_manager:settings:extra_contexts:layout' => 'Layout', - 'widget_manager:settings:extra_contexts:manager' => 'Beheerder', + 'widget_manager:settings:extra_contexts:layout:help' => 'Bepaald het aantal kolommen', + 'widget_manager:settings:extra_contexts:manager' => 'Beheerders', + 'widget_manager:settings:extra_contexts:manager:help' => 'Gebruikers die deze pagina kunnen beheren', 'widget_manager:action:force_tool_widgets:error:not_enabled' => 'Widget beheer voor groepen is niet ingeschakeld', 'widget_manager:action:force_tool_widgets:success' => 'Widgets voor groep tool geforceerd bij %s groepen', 'widget_manager:settings:extra_contexts:description' => 'Voer de url in van de nieuwe pagina welke een layout gelijk de widget manager startpagina krijgt. U kunt zoveel pagina\'s toevoegen als nodig is. Vergewis uzelve dat opgegeven pagina nog niet in gebruik is. Alle widgets die normaliter op de voorpagina beschikbaar zijn, zullen ook op deze nieuwe pagina beschikbaar komen. U kunt ook de kolom indeling kiezen en optioneel gewone gebruikers als manager van deze pagina toewijzen.', diff --git a/views/default/forms/widget_manager/widget_page.php b/views/default/forms/widget_manager/widget_page.php index 119f701..96eebe1 100644 --- a/views/default/forms/widget_manager/widget_page.php +++ b/views/default/forms/widget_manager/widget_page.php @@ -1,6 +1,9 @@ canEdit()) { + throw new \Elgg\Exceptions\Http\EntityPermissionsException(); +} echo elgg_format_element('div', ['class' => 'elgg-subtext mbm'], elgg_echo('widget_manager:settings:extra_contexts:description')); @@ -10,13 +13,15 @@ 'value' => $entity?->guid, ]); -echo elgg_view_field([ - '#type' => 'text', - '#label' => elgg_echo('widget_manager:settings:extra_contexts:page'), - 'name' => 'url', - 'value' => $entity?->url, - 'required' => true, -]); +if (elgg_is_admin_logged_in()) { + echo elgg_view_field([ + '#type' => 'text', + '#label' => elgg_echo('widget_manager:settings:extra_contexts:page'), + 'name' => 'url', + 'value' => $entity?->url, + 'required' => true, + ]); +} echo elgg_view_field([ '#type' => 'text', @@ -47,6 +52,7 @@ echo elgg_view_field([ '#type' => 'select', '#label' => elgg_echo('widget_manager:settings:extra_contexts:layout'), + '#help' => elgg_echo('widget_manager:settings:extra_contexts:layout:help'), 'name' => 'layout', 'options_values' => [ '33|33|33' => elgg_echo('widget_manager:settings:widget_layout:33|33|33'), @@ -66,8 +72,10 @@ echo elgg_view_field([ '#type' => 'userpicker', '#label' => elgg_echo('widget_manager:settings:extra_contexts:manager'), + '#help' => elgg_echo('widget_manager:settings:extra_contexts:manager:help'), 'name' => 'manager', 'value' => $entity?->getManagers(), + 'show_friends' => false, ]); $footer = elgg_view_field([ diff --git a/views/default/resources/widget_manager/widget_page.php b/views/default/resources/widget_manager/widget_page.php index 1fedb96..5b414a7 100644 --- a/views/default/resources/widget_manager/widget_page.php +++ b/views/default/resources/widget_manager/widget_page.php @@ -43,8 +43,7 @@ break; } -$title = $widget_page->title ?: false; -if ($title && $widget_page->canEdit()) { +if ($widget_page->canEdit()) { $href = elgg_generate_url('widgets:add_panel', [ 'context' => elgg_get_context(), 'context_stack' => elgg_get_context_stack(), @@ -85,6 +84,8 @@ ]); } +$title = $widget_page->title ?: false; + $content = ''; if ($widget_page->show_description !== false && !empty($widget_page->description)) { @@ -96,10 +97,11 @@ 'num_columns' => $num_columns, 'column_classes' => $column_classes, 'exact_match' => true, - 'show_add_widgets' => empty($title), + 'show_add_widgets' => false, ]); echo elgg_view_page($widget_page->getDisplayName(), [ 'title' => $title, 'content' => $content, + 'entity' => $widget_page, ]); From 117845a56ea1a0c595bc62012a6d819363c0baf4 Mon Sep 17 00:00:00 2001 From: Jeroen Dalsem Date: Thu, 1 Aug 2024 10:23:45 +0200 Subject: [PATCH 2/4] chore: moved the full view contents to the object view --- views/default/object/widget_page.php | 51 +++++++++++++++++-- .../resources/widget_manager/widget_page.php | 46 +---------------- 2 files changed, 48 insertions(+), 49 deletions(-) diff --git a/views/default/object/widget_page.php b/views/default/object/widget_page.php index 11939dd..2c4033b 100644 --- a/views/default/object/widget_page.php +++ b/views/default/object/widget_page.php @@ -4,11 +4,52 @@ return; } -$vars['icon'] = false; -$vars['byline'] = false; +if (!elgg_extract('full_view', $vars)) { + $vars['icon'] = false; + $vars['byline'] = false; + + $title = $entity->getDisplayName() . " [{$entity->url}]"; + + $vars['title'] = elgg_view_url($entity->getURL(), elgg_get_excerpt($title, 100)); + + echo elgg_view('object/elements/summary', $vars); + return; +} + +elgg_push_context('index'); +elgg_set_page_owner_guid($entity->guid); + +$num_columns = $entity->getNumColumns(); +$layout = $entity->layout; -$title = $entity->getDisplayName() . " [{$entity->url}]"; +$classes = []; +$column_classes = []; -$vars['title'] = elgg_view_url($entity->getURL(), elgg_get_excerpt($title, 100)); +switch ($layout) { + case '33|33|33': + $classes[] = 'widgets-3-columns'; + break; + case '50|50': + $classes[] = 'widgets-2-columns'; + break; + default: + $classes[] = "widgets-{$num_columns}-columns"; + + $columns = array_reverse(explode('|', $layout)); + foreach ($columns as $column_index => $column_width) { + $column_classes[$column_index + 1] = "col-width-{$column_width}"; + } + break; +} + +if ($entity->show_description !== false && !empty($entity->description)) { + echo elgg_view('output/longtext', ['value' => $entity->description, 'class' => 'widget-page-description']); +} -echo elgg_view('object/elements/summary', $vars); +echo elgg_view_layout('widgets', [ + 'class' => $classes, + 'num_columns' => $num_columns, + 'column_classes' => $column_classes, + 'exact_match' => true, + 'show_add_widgets' => false, +]); diff --git a/views/default/resources/widget_manager/widget_page.php b/views/default/resources/widget_manager/widget_page.php index 5b414a7..e3b5d7a 100644 --- a/views/default/resources/widget_manager/widget_page.php +++ b/views/default/resources/widget_manager/widget_page.php @@ -17,32 +17,6 @@ $widget_page = $pages[0]; -elgg_push_context('index'); -elgg_set_page_owner_guid($widget_page->guid); - -$num_columns = $widget_page->getNumColumns(); -$layout = $widget_page->layout; - -$classes = []; -$column_classes = []; - -switch ($layout) { - case '33|33|33': - $classes[] = 'widgets-3-columns'; - break; - case '50|50': - $classes[] = 'widgets-2-columns'; - break; - default: - $classes[] = "widgets-{$num_columns}-columns"; - - $columns = array_reverse(explode('|', $layout)); - foreach ($columns as $column_index => $column_width) { - $column_classes[$column_index + 1] = "col-width-{$column_width}"; - } - break; -} - if ($widget_page->canEdit()) { $href = elgg_generate_url('widgets:add_panel', [ 'context' => elgg_get_context(), @@ -84,24 +58,8 @@ ]); } -$title = $widget_page->title ?: false; - -$content = ''; - -if ($widget_page->show_description !== false && !empty($widget_page->description)) { - $content .= elgg_view('output/longtext', ['value' => $widget_page->description, 'class' => 'widget-page-description']); -} - -$content .= elgg_view_layout('widgets', [ - 'class' => $classes, - 'num_columns' => $num_columns, - 'column_classes' => $column_classes, - 'exact_match' => true, - 'show_add_widgets' => false, -]); - echo elgg_view_page($widget_page->getDisplayName(), [ - 'title' => $title, - 'content' => $content, + 'title' => $widget_page->title ?: false, + 'content' => elgg_view_entity($widget_page), 'entity' => $widget_page, ]); From 5f42092d6cea2c15ecc5240e439b95fb2f7e651d Mon Sep 17 00:00:00 2001 From: Jeroen Dalsem Date: Fri, 2 Aug 2024 07:53:24 +0200 Subject: [PATCH 3/4] chore: set context early for menu items --- views/default/object/widget_page.php | 3 --- views/default/resources/widget_manager/widget_page.php | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/views/default/object/widget_page.php b/views/default/object/widget_page.php index 2c4033b..7bcac70 100644 --- a/views/default/object/widget_page.php +++ b/views/default/object/widget_page.php @@ -16,9 +16,6 @@ return; } -elgg_push_context('index'); -elgg_set_page_owner_guid($entity->guid); - $num_columns = $entity->getNumColumns(); $layout = $entity->layout; diff --git a/views/default/resources/widget_manager/widget_page.php b/views/default/resources/widget_manager/widget_page.php index e3b5d7a..d6e01bd 100644 --- a/views/default/resources/widget_manager/widget_page.php +++ b/views/default/resources/widget_manager/widget_page.php @@ -17,6 +17,9 @@ $widget_page = $pages[0]; +elgg_push_context('index'); +elgg_set_page_owner_guid($widget_page->guid); + if ($widget_page->canEdit()) { $href = elgg_generate_url('widgets:add_panel', [ 'context' => elgg_get_context(), From 83e9d44051d58af53b9dcdff42b5ea41af810101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jer=C3=B4me=20Bakker?= Date: Wed, 7 Aug 2024 09:12:53 +0200 Subject: [PATCH 4/4] chore: wrapping up v16.2 --- CHANGES.txt | 4 ++++ elgg-plugin.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 2375fdc..96b792d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,10 @@ Version history =============== +16.2 (2024-08-07): + +- added: widget page manager can now edit page on the front end + 16.1.1 (2024-06-05): - several small chores/fixes diff --git a/elgg-plugin.php b/elgg-plugin.php index eea5a9b..937c62b 100644 --- a/elgg-plugin.php +++ b/elgg-plugin.php @@ -14,7 +14,7 @@ return [ 'plugin' => [ - 'version' => '16.1.1', + 'version' => '16.2', 'dependencies' => [ 'profile' => [ 'must_be_active' => false,