diff --git a/locales/en-US.json b/locales/en-US.json index 573fb71d..e3ffadb9 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -105,6 +105,7 @@ "preferences_category_visual": "Visual preferences", "preferences_region_label": "Content country: ", "preferences_player_style_label": "Player style: ", + "preferences_previous_page_button_label": "Previous page button (requires Javascript):", "Dark mode: ": "Dark mode: ", "preferences_dark_mode_label": "Theme: ", "dark": "dark", diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 429d9246..56c09beb 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -44,6 +44,7 @@ struct ConfigPreferences property vr_mode : Bool = true property show_nick : Bool = true property save_player_pos : Bool = false + property previous_page_button : Bool = true def to_tuple {% begin %} diff --git a/src/invidious/frontend/pagination.cr b/src/invidious/frontend/pagination.cr index 13464503..4a9d76d7 100644 --- a/src/invidious/frontend/pagination.cr +++ b/src/invidious/frontend/pagination.cr @@ -3,7 +3,10 @@ require "uri" module Invidious::Frontend::Pagination extend self - private def first_page(str : String::Builder, locale : String?, url : String) + private def first_page(str : String::Builder, locale : String?, url : String, previous_page_button : Bool) + if previous_page_button + str << %(<noscript>) + end str << %(<a href=") << url << %(" class="pure-button pure-button-secondary">) if locale_is_rtl?(locale) @@ -19,6 +22,9 @@ module Invidious::Frontend::Pagination end str << "</a>" + if previous_page_button + str << "</noscript>" + end end private def previous_page(str : String::Builder, locale : String?, url : String) @@ -90,7 +96,7 @@ module Invidious::Frontend::Pagination end end - def nav_ctoken(locale : String?, *, base_url : String | URI, ctoken : String?, first_page : Bool) + def nav_ctoken(locale : String?, *, base_url : String | URI, ctoken : String?, first_page : Bool, previous_page_button : Bool) return String.build do |str| str << %(<div class="h-box">\n) str << %(<div class="page-nav-container flexible">\n) @@ -98,7 +104,7 @@ module Invidious::Frontend::Pagination str << %(<div class="page-prev-container flex-left">) if !first_page - self.first_page(str, locale, base_url.to_s) + self.first_page(str, locale, base_url.to_s, previous_page_button) end str << %(</div>\n) diff --git a/src/invidious/routes/before_all.cr b/src/invidious/routes/before_all.cr index 396840a4..be80659f 100644 --- a/src/invidious/routes/before_all.cr +++ b/src/invidious/routes/before_all.cr @@ -104,10 +104,13 @@ module Invidious::Routes::BeforeAll thin_mode = env.params.query["thin_mode"]? || preferences.thin_mode.to_s thin_mode = thin_mode == "true" locale = env.params.query["hl"]? || preferences.locale + previous_page_button = env.params.query["previous_page_button"]? || preferences.previous_page_button.to_s + previous_page_button = previous_page_button == "true" preferences.dark_mode = dark_mode preferences.thin_mode = thin_mode preferences.locale = locale + preferences.previous_page_button = previous_page_button env.set "preferences", preferences current_page = env.request.path diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr index abe0f34e..5c86202d 100644 --- a/src/invidious/routes/preferences.cr +++ b/src/invidious/routes/preferences.cr @@ -140,6 +140,10 @@ module Invidious::Routes::PreferencesRoute notifications_only ||= "off" notifications_only = notifications_only == "on" + previous_page_button = env.params.body["previous_page_button"]?.try &.as(String) + previous_page_button ||= "off" + previous_page_button = previous_page_button == "on" + # Convert to JSON and back again to take advantage of converters used for compatibility preferences = Preferences.from_json({ annotations: annotations, @@ -175,6 +179,7 @@ module Invidious::Routes::PreferencesRoute vr_mode: vr_mode, show_nick: show_nick, save_player_pos: save_player_pos, + previous_page_button: previous_page_button }.to_json) if user = env.get? "user" diff --git a/src/invidious/user/preferences.cr b/src/invidious/user/preferences.cr index b3059403..a0ea3018 100644 --- a/src/invidious/user/preferences.cr +++ b/src/invidious/user/preferences.cr @@ -55,6 +55,7 @@ struct Preferences property extend_desc : Bool = CONFIG.default_user_preferences.extend_desc property volume : Int32 = CONFIG.default_user_preferences.volume property save_player_pos : Bool = CONFIG.default_user_preferences.save_player_pos + property previous_page_button : Bool = CONFIG.default_user_preferences.previous_page_button module BoolToString def self.to_json(value : String, json : JSON::Builder) diff --git a/src/invidious/views/channel.ecr b/src/invidious/views/channel.ecr index df39d1ea..123a0a50 100644 --- a/src/invidious/views/channel.ecr +++ b/src/invidious/views/channel.ecr @@ -21,7 +21,8 @@ page_nav_html = IV::Frontend::Pagination.nav_ctoken(locale, base_url: relative_url, ctoken: next_continuation, - first_page: continuation.nil? + first_page: continuation.nil?, + previous_page_button: env.get("preferences").as(Preferences).previous_page_button ) %> @@ -41,6 +42,10 @@ <link rel="alternate" type="application/rss+xml" title="RSS" href="/feed/channel/<%= ucid %>" /> <%- end -%> +<%- if env.get("preferences").as(Preferences).previous_page_button -%> +<script src="/js/pagination.js?v=<%= ASSET_COMMIT %>"></script> +<%- end -%> + <link rel="alternate" href="<%= youtube_url %>"> <title><%= author %> - Invidious</title> <% end %> diff --git a/src/invidious/views/components/items_paginated.ecr b/src/invidious/views/components/items_paginated.ecr index 4534a0a3..d0cb8771 100644 --- a/src/invidious/views/components/items_paginated.ecr +++ b/src/invidious/views/components/items_paginated.ecr @@ -8,4 +8,14 @@ <%= page_nav_html %> +<script id="pagination-data" type="application/json"> +<%= +{ + "next_page" => translate(locale, "Next page"), + "prev_page" => translate(locale, "Previous page"), + "is_rtl" => locale_is_rtl?(locale) +}.to_json +%> +</script> + <script src="/js/watched_indicator.js"></script> diff --git a/src/invidious/views/user/preferences.ecr b/src/invidious/views/user/preferences.ecr index 55349c5a..4b915a53 100644 --- a/src/invidious/views/user/preferences.ecr +++ b/src/invidious/views/user/preferences.ecr @@ -189,6 +189,12 @@ </select> <% end %> </div> + + <div class="pure-control-group"> + <label for="previous_page_button"><%= translate(locale, "preferences_previous_page_button_label") %></label> + <input name="previous_page_button" id="previous_page_button" type="checkbox" <% if preferences.previous_page_button %>checked<% end %>> + </div> + <% if env.get? "user" %> <div class="pure-control-group"> <label for="show_nick"><%= translate(locale, "preferences_show_nick_label") %></label>