diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php index 8eaaa9fc88..53faa4bc7d 100644 --- a/phpBB/includes/acp/acp_board.php +++ b/phpBB/includes/acp/acp_board.php @@ -495,6 +495,7 @@ class acp_board 'webpush_vapid_public' => ['lang' => 'WEBPUSH_VAPID_PUBLIC', 'validate' => 'string', 'type' => 'text:25:255', 'explain' => true], 'webpush_vapid_private' => ['lang' => 'WEBPUSH_VAPID_PRIVATE', 'validate' => 'string', 'type' => 'password:25:255', 'explain' => true], 'webpush_method_enables' => ['lang' => 'WEBPUSH_METHOD_ENABLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true], + 'webpush_dropdown_subscribe'=> ['lang' => 'WEBPUSH_DROPDOWN_SUBSCRIBE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true], 'legend3' => 'ACP_SUBMIT_CHANGES', ], diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index bca9a97c48..fdc2d42ab9 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -3853,6 +3853,9 @@ function page_header($page_title = '', $display_online_list = false, $item_id = $timezone_name = $user->lang['timezones'][$timezone_name]; } + /** @var \phpbb\controller\helper $controller_helper */ + $controller_helper = $phpbb_container->get('controller.helper'); + // Output the notifications $notifications = false; if ($config['load_notifications'] && $config['allow_board_notifications'] && $user->data['user_id'] != ANONYMOUS && $user->data['user_type'] != USER_IGNORE) @@ -3869,10 +3872,19 @@ function page_header($page_title = '', $display_online_list = false, $item_id = { $template->assign_block_vars('notifications', $notification->prepare_for_display()); } + + // Get web push notification data + $methods = $phpbb_notifications->get_subscription_methods(); + if ($config['webpush_dropdown_subscribe'] && array_key_exists('notification.method.webpush', $methods)) + { + /** @var \phpbb\form\form_helper $form_helper */ + $form_helper = $phpbb_container->get('form_helper'); + + $template_ary = $methods['notification.method.webpush']['method']->get_ucp_template_data($controller_helper, $form_helper); + $template->assign_vars($template_ary); + } } - /** @var \phpbb\controller\helper $controller_helper */ - $controller_helper = $phpbb_container->get('controller.helper'); $notification_mark_hash = generate_link_hash('mark_all_notifications_read'); $phpbb_version_parts = explode('.', PHPBB_VERSION, 3); diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index f57a9f466b..9cabeb3e27 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -330,6 +330,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('webpush_enable', ' INSERT INTO phpbb_config (config_name, config_value) VALUES ('webpush_vapid_public', ''); INSERT INTO phpbb_config (config_name, config_value) VALUES ('webpush_vapid_private', ''); INSERT INTO phpbb_config (config_name, config_value) VALUES ('webpush_method_enables', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('webpush_dropdown_subscribe', '0'); INSERT INTO phpbb_config (config_name, config_value, is_dynamic) VALUES ('cache_last_gc', '0', 1); INSERT INTO phpbb_config (config_name, config_value, is_dynamic) VALUES ('cron_lock', '0', 1); diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php index 484d651c75..3353a360e8 100644 --- a/phpBB/language/en/acp/board.php +++ b/phpBB/language/en/acp/board.php @@ -592,6 +592,8 @@ $lang = array_merge($lang, [ 'WEBPUSH_VAPID_PRIVATE_EXPLAIN' => 'The Voluntary Application Server Identification (VAPID) private key is used to generate authenticated push messages dispatched from your site. The VAPID private key must form a valid public-private key pair alongside the VAPID public key.
Caution: Modifying the VAPID private key will automatically render all Web Push subscriptions invalid.', 'WEBPUSH_METHOD_ENABLES' => 'Enable all user-based web push notification options by default', 'WEBPUSH_METHOD_ENABLES_EXPLAIN'=> 'When this setting is enabled, users who subscribe and allow browser notifications will start receiving them automatically. Users only need to visit the UCP Notification settings to disable any unwanted notifications.

If this setting is disabled, users will not receive any notifications, even if they have subscribed, until they visit the UCP Notification settings to enable the specific notification options they wish to receive.', + 'WEBPUSH_DROPDOWN_SUBSCRIBE' => 'Show “Subscribe” button in notification dropdown', + 'WEBPUSH_DROPDOWN_SUBSCRIBE_EXPLAIN'=> 'Display a “Subscribe” button in the Notification dropdown, allowing users to easily subscribe to push notifications from anywhere in the forum.', ]); // Jabber settings diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 71790e499b..5933cc8f5c 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -512,6 +512,9 @@ $lang = array_merge($lang, array( ), 'NOTIFY_ADMIN' => 'Please notify the board administrator or webmaster.', 'NOTIFY_ADMIN_EMAIL' => 'Please notify the board administrator or webmaster: %1$s', + 'NOTIFY_WEB_PUSH_ENABLE' => 'Enable Web Push notifications', + 'NOTIFY_WEB_PUSH_SUBSCRIBE' => 'Subscribe', + 'NOTIFY_WEB_PUSH_SUBSCRIBED'=> 'Subscribed', 'NO_ACCESS_ATTACHMENT' => 'You are not allowed to access this file.', 'NO_ACTION' => 'No action specified.', 'NO_ADMINISTRATORS' => 'There are no administrators.', diff --git a/phpBB/phpbb/db/migration/data/v400/add_webpush_options.php b/phpBB/phpbb/db/migration/data/v400/add_webpush_options.php index 99ef6bd28f..d7478edfea 100644 --- a/phpBB/phpbb/db/migration/data/v400/add_webpush_options.php +++ b/phpBB/phpbb/db/migration/data/v400/add_webpush_options.php @@ -26,13 +26,14 @@ class add_webpush_options extends migration public function effectively_installed(): bool { - return $this->config->offsetExists('webpush_method_enables'); + return $this->config->offsetExists('webpush_method_enables') || $this->config->offsetExists('webpush_dropdown_subscribe'); } public function update_data(): array { return [ ['config.add', ['webpush_method_enables', false]], + ['config.add', ['webpush_dropdown_subscribe', false]], ]; } @@ -40,6 +41,7 @@ class add_webpush_options extends migration { return [ ['config.remove', ['webpush_method_enables']], + ['config.remove', ['webpush_dropdown_subscribe']], ]; } } diff --git a/phpBB/phpbb/notification/method/webpush.php b/phpBB/phpbb/notification/method/webpush.php index e1fc1f04ee..dcf1d1ebbf 100644 --- a/phpBB/phpbb/notification/method/webpush.php +++ b/phpBB/phpbb/notification/method/webpush.php @@ -355,7 +355,7 @@ class webpush extends messenger_base implements extended_method_interface } return [ - 'NOTIFICATIONS_WEBPUSH_ENABLE' => true, + 'NOTIFICATIONS_WEBPUSH_ENABLE' => $this->config['webpush_dropdown_subscribe'] || stripos($this->user->page['page'], 'notification_options'), 'U_WEBPUSH_SUBSCRIBE' => $controller_helper->route('phpbb_ucp_push_subscribe_controller'), 'U_WEBPUSH_UNSUBSCRIBE' => $controller_helper->route('phpbb_ucp_push_unsubscribe_controller'), 'VAPID_PUBLIC_KEY' => $this->config['webpush_vapid_public'], diff --git a/phpBB/styles/prosilver/template/notification_dropdown.html b/phpBB/styles/prosilver/template/notification_dropdown.html index 52bc546976..841f541744 100644 --- a/phpBB/styles/prosilver/template/notification_dropdown.html +++ b/phpBB/styles/prosilver/template/notification_dropdown.html @@ -44,6 +44,13 @@ + {% if NOTIFICATIONS_WEBPUSH_ENABLE and notification_types is not defined %} + + {% endif %} {% EVENT notification_dropdown_footer_after %} diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html index b88de2aaa8..790f793d8f 100644 --- a/phpBB/styles/prosilver/template/overall_header.html +++ b/phpBB/styles/prosilver/template/overall_header.html @@ -63,6 +63,10 @@ +{% if NOTIFICATIONS_WEBPUSH_ENABLE %} + {% include('ucp_notifications_webpush.html') %} +{% endif %} + diff --git a/phpBB/styles/prosilver/template/ucp_notifications_options.html b/phpBB/styles/prosilver/template/ucp_notifications_options.html index a0d9caad12..b3be983f16 100644 --- a/phpBB/styles/prosilver/template/ucp_notifications_options.html +++ b/phpBB/styles/prosilver/template/ucp_notifications_options.html @@ -1,9 +1,5 @@ {% include('ucp_header.html') %} -{% if NOTIFICATIONS_WEBPUSH_ENABLE %} - {% include('ucp_notifications_webpush.html') %} -{% endif %} -

{{ TITLE }}

diff --git a/phpBB/styles/prosilver/theme/buttons.css b/phpBB/styles/prosilver/theme/buttons.css index e8f8fbe961..fda72c8613 100644 --- a/phpBB/styles/prosilver/theme/buttons.css +++ b/phpBB/styles/prosilver/theme/buttons.css @@ -220,3 +220,9 @@ button::-moz-focus-inner { .avatar-cropper-buttons > .button-group { margin: 4px; } + +/* Notification buttons +--------------------------------------------- */ +.notification-subscribe_toggle:disabled { + opacity: 0.7; +} diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 240ba25d03..2300f9c611 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -1340,6 +1340,15 @@ ul.linklist:after, display: block; } +.dropdown-extended .notification-dropdown-footer { + white-space: nowrap; + border-top: solid 1px #b9b9b9; + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + padding: 5px 10px; +} + .notification-avatar, .notification-menu .notification-list .notification-item .avatar, .notification-menu .notification-list .notification-item .gravatar {