2018-09-21 18:53:29 -07:00
{{ define "title"}}{{ t "page.settings.title" }}{{ end }}
2017-11-19 21:10:04 -08:00
2024-01-27 16:25:55 +08:00
{{ define "page_header"}}
< section class = "page-header" aria-labelledby = "page-header-title" >
2024-01-25 14:22:18 +08:00
< h1 id = "page-header-title" > {{ t "page.settings.title" }}< / h1 >
2019-11-17 17:26:47 -08:00
{{ template "settings_menu" dict "user" .user }}
2024-01-27 16:25:55 +08:00
< / section >
2024-01-25 14:22:18 +08:00
{{ end }}
2017-11-19 21:10:04 -08:00
2024-01-25 14:22:18 +08:00
{{ define "content"}}
2017-11-19 21:10:04 -08:00
< form method = "post" autocomplete = "off" action = "{{ route " updateSettings " } } " >
< input type = "hidden" name = "csrf" value = "{{ .csrf }}" >
{{ if .errorMessage }}
2024-02-05 14:20:05 +08:00
< div role = "alert" class = "alert alert-error" > {{ .errorMessage }}< / div >
2017-11-19 21:10:04 -08:00
{{ end }}
2024-08-12 19:27:08 -07:00
{{ if not disableLocalAuth }}
2023-09-11 11:35:08 -07:00
< fieldset >
< legend > {{ t "form.prefs.fieldset.authentication_settings" }}< / legend >
< label for = "form-username" > {{ t "form.user.label.username" }}< / label >
< input type = "text" name = "username" id = "form-username" value = "{{ .form.Username }}" autocomplete = "username" required >
2024-01-25 14:22:18 +08:00
2023-09-11 11:35:08 -07:00
< label for = "form-password" > {{ t "form.user.label.password" }}< / label >
< input type = "password" name = "password" id = "form-password" value = "{{ .form.Password }}" autocomplete = "new-password" >
2024-01-25 14:22:18 +08:00
2023-09-11 11:35:08 -07:00
< label for = "form-confirmation" > {{ t "form.user.label.confirmation" }}< / label >
< input type = "password" name = "confirmation" id = "form-confirmation" value = "{{ .form.Confirmation }}" autocomplete = "new-password" >
{{ if hasOAuth2Provider "google" }}
2025-05-11 17:57:56 -07:00
< p >
2023-09-11 11:35:08 -07:00
{{ if .user.GoogleID }}
< a href = "{{ route " oauth2Unlink " " provider " " google " } } " > {{ t "page.settings.unlink_google_account" }}< / a >
{{ else }}
< a href = "{{ route " oauth2Redirect " " provider " " google " } } " > {{ t "page.settings.link_google_account" }}< / a >
{{ end }}
2025-05-11 17:57:56 -07:00
< / p >
2023-09-11 11:35:08 -07:00
{{ else if hasOAuth2Provider "oidc" }}
2025-05-11 17:57:56 -07:00
< p >
2023-09-11 11:35:08 -07:00
{{ if .user.OpenIDConnectID }}
2024-08-12 22:05:15 -07:00
< a href = "{{ route " oauth2Unlink " " provider " " oidc " } } " > {{ t "page.settings.unlink_oidc_account" oidcProviderName }}< / a >
2023-09-11 11:35:08 -07:00
{{ else }}
2024-08-12 22:05:15 -07:00
< a href = "{{ route " oauth2Redirect " " provider " " oidc " } } " > {{ t "page.settings.link_oidc_account" oidcProviderName }}< / a >
2023-09-11 11:35:08 -07:00
{{ end }}
2025-05-11 17:57:56 -07:00
< / p >
2023-09-11 11:35:08 -07:00
{{ end }}
< div class = "buttons" >
< button type = "submit" class = "button button-primary" data-label-loading = "{{ t " form . submit . saving " } } " > {{ t "action.update" }}< / button >
< / div >
2023-11-08 19:01:15 +00:00
< / fieldset >
2024-08-12 19:27:08 -07:00
{{ end }}
2023-11-08 19:01:15 +00:00
{{ if .webAuthnEnabled }}
< fieldset >
< legend > {{ t "page.settings.webauthn.passkeys" }}< / legend >
2023-11-06 04:27:35 +10:30
2024-02-05 14:20:05 +08:00
< div role = "alert" class = "alert alert-error hidden" id = "webauthn-error" >
2023-11-06 04:27:35 +10:30
{{ t "page.settings.webauthn.register.error" }}
< / div >
2023-11-08 19:01:15 +00:00
{{ if .webAuthnCerts}}
< table >
< tr >
< th > {{ t "page.settings.webauthn.passkey_name" }}< / th >
< th > {{ t "page.settings.webauthn.added_on" }}< / th >
< th > {{ t "page.settings.webauthn.last_seen_on" }}< / th >
< th > {{ t "page.settings.webauthn.actions" }}< / th >
< / tr >
{{ range .webAuthnCerts }}
< tr >
< td > {{ .Name }}< / td >
< td > {{ elapsed $.user.Timezone .AddedOn }}< / td >
< td > {{ elapsed $.user.Timezone .LastSeenOn }}< / td >
< td >
< a href = "#"
data-confirm="true"
data-label-question="{{ t "confirm.question" }}"
data-label-yes="{{ t "confirm.yes" }}"
data-label-no="{{ t "confirm.no" }}"
data-label-loading="{{ t "confirm.loading" }}"
data-url="{{ route "webauthnDelete" "credentialHandle" .HandleEncoded }}">{{ icon "delete" }}{{ t "action.remove" }}< / a >
< a href = "{{ route " webauthnRename " " credentialHandle " . HandleEncoded } } " > {{ icon "edit" }} {{ t "action.edit" }}< / a >
< / td >
< / tr >
{{ end }}
< / table >
{{ end }}
2023-11-06 04:27:35 +10:30
< div class = "buttons" >
2023-11-08 19:01:15 +00:00
< button class = "button button-primary" id = "webauthn-register" disabled >
2023-11-06 04:27:35 +10:30
{{ t "page.settings.webauthn.register" }}
< / button >
{{ if gt .countWebAuthnCerts 0}}
2023-11-08 19:01:15 +00:00
< button class = "button button-danger" id = "webauthn-delete" >
2023-11-06 04:27:35 +10:30
{{ plural "page.settings.webauthn.delete" .countWebAuthnCerts .countWebAuthnCerts }}
< / button >
{{ end }}
< / div >
2023-09-11 11:35:08 -07:00
< / fieldset >
2023-11-08 19:01:15 +00:00
{{ end }}
2023-09-11 11:35:08 -07:00
< fieldset >
< legend > {{ t "form.prefs.fieldset.reader_settings" }}< / legend >
< label for = "form-cjk-reading-speed" > {{ t "form.prefs.label.cjk_reading_speed" }}< / label >
< input type = "number" name = "cjk_reading_speed" id = "form-cjk-reading-speed" value = "{{ .form.CJKReadingSpeed }}" min = "1" >
< label for = "form-default-reading-speed" > {{ t "form.prefs.label.default_reading_speed" }}< / label >
< input type = "number" name = "default_reading_speed" id = "form-default-reading-speed" value = "{{ .form.DefaultReadingSpeed }}" min = "1" >
2024-01-25 14:22:18 +08:00
2024-03-16 14:20:02 +01:00
< label for = "form-media-playback-rate" > {{ t "form.prefs.label.media_playback_rate" }}< / label >
< input type = "number" name = "media_playback_rate" id = "form-media-playback-rate" value = "{{ .form.MediaPlaybackRate }}" min = "0.25" max = "4" step = "any" / >
2023-09-11 11:35:08 -07:00
< label > < input type = "checkbox" name = "show_reading_time" value = "1" { { if . form . ShowReadingTime } } checked { { end } } > {{ t "form.prefs.label.show_reading_time" }}< / label >
2025-01-12 16:11:15 -08:00
< label > < input type = "radio" name = "mark_read_behavior" value = "{{ .readBehaviors.NoAutoMarkAsRead }}"
{{ if eq .form.MarkReadBehavior .readBehaviors.NoAutoMarkAsRead }}checked{{end}} > {{ t "form.prefs.label.mark_read_manually" }}< / label >
< label > < input type = "radio" name = "mark_read_behavior" value = "{{ .readBehaviors.MarkAsReadOnView }}"
{{ if eq .form.MarkReadBehavior .readBehaviors.MarkAsReadOnView }}checked{{end}} > {{ t "form.prefs.label.mark_read_on_view" }}< / label >
< label > < input type = "radio" name = "mark_read_behavior" value = "{{ .readBehaviors.MarkAsReadOnViewButWaitForPlayerCompletion }}"
{{ if eq .form.MarkReadBehavior .readBehaviors.MarkAsReadOnViewButWaitForPlayerCompletion }}checked{{end}}> {{ t "form.prefs.label.mark_read_on_view_or_media_completion" }}< / label >
< label > < input type = "radio" name = "mark_read_behavior" value = "{{ .readBehaviors.MarkAsReadOnlyOnPlayerCompletion }}"
{{ if eq .form.MarkReadBehavior .readBehaviors.MarkAsReadOnlyOnPlayerCompletion }}checked{{end}} > {{ t "form.prefs.label.mark_read_on_media_completion" }}< / label >
2023-09-11 11:35:08 -07:00
< div class = "buttons" >
< button type = "submit" class = "button button-primary" data-label-loading = "{{ t " form . submit . saving " } } " > {{ t "action.update" }}< / button >
< / div >
< / fieldset >
< fieldset >
< legend > {{ t "form.prefs.fieldset.application_settings" }}< / legend >
< label for = "form-language" > {{ t "form.prefs.label.language" }}< / label >
< select id = "form-language" name = "language" >
{{ range $key, $value := .languages }}
< option value = "{{ $key }}" { { if eq $ key $ . form . Language } } selected = "selected" { { end } } > {{ $value }}< / option >
{{ end }}
< / select >
< label for = "form-timezone" > {{ t "form.prefs.label.timezone" }}< / label >
< select id = "form-timezone" name = "timezone" >
{{ range $key, $value := .timezones }}
< option value = "{{ $key }}" { { if eq $ key $ . form . Timezone } } selected = "selected" { { end } } > {{ $value }}< / option >
{{ end }}
< / select >
< label for = "form-theme" > {{ t "form.prefs.label.theme" }}< / label >
< select id = "form-theme" name = "theme" >
{{ range $key, $value := .themes }}
< option value = "{{ $key }}" { { if eq $ key $ . form . Theme } } selected = "selected" { { end } } > {{ $value }}< / option >
{{ end }}
< / select >
< div class = "form-label-row" >
< label for = "form-display-mode" > {{ t "form.prefs.label.display_mode" }}< / label >
2025-06-08 20:47:57 -07:00
< a href = "https://developer.mozilla.org/en-US/docs/Web/Manifest/display" { { if $ . user . OpenExternalLinksInNewTab } } target = "_blank" { { end } } >
2023-09-11 11:35:08 -07:00
{{ icon "external-link" }}
< / a >
< / div >
< select id = "form-display-mode" name = "display_mode" >
< option value = "fullscreen" { { if eq " fullscreen " $ . form . DisplayMode } } selected = "selected" { { end } } > {{ t "form.prefs.select.fullscreen" }}< / option >
< option value = "standalone" { { if eq " standalone " $ . form . DisplayMode } } selected = "selected" { { end } } > {{ t "form.prefs.select.standalone" }}< / option >
< option value = "minimal-ui" { { if eq " minimal-ui " $ . form . DisplayMode } } selected = "selected" { { end } } > {{ t "form.prefs.select.minimal_ui" }}< / option >
< option value = "browser" { { if eq " browser " $ . form . DisplayMode } } selected = "selected" { { end } } > {{ t "form.prefs.select.browser" }}< / option >
< / select >
< label for = "form-default-home-page" > {{ t "form.prefs.label.default_home_page" }}< / label >
< select id = "form-default-home-page" name = "default_home_page" >
{{ range $key, $value := .default_home_pages }}
< option value = "{{ $key }}" { { if eq $ key $ . form . DefaultHomePage } } selected = "selected" { { end } } > {{ t $value }}< / option >
{{ end }}
< / select >
< label for = "form-entry-direction" > {{ t "form.prefs.label.entry_sorting" }}< / label >
< select id = "form-entry-direction" name = "entry_direction" >
< option value = "asc" { { if eq " asc " $ . form . EntryDirection } } selected = "selected" { { end } } > {{ t "form.prefs.select.older_first" }}< / option >
< option value = "desc" { { if eq " desc " $ . form . EntryDirection } } selected = "selected" { { end } } > {{ t "form.prefs.select.recent_first" }}< / option >
< / select >
2024-01-25 14:22:18 +08:00
2023-09-11 11:35:08 -07:00
< label for = "form-entry-order" > {{ t "form.prefs.label.entry_order" }}< / label >
< select id = "form-entry-order" name = "entry_order" >
< option value = "published_at" { { if eq " published_at " $ . form . EntryOrder } } selected = "selected" { { end } } > {{ t "form.prefs.select.publish_time" }}< / option >
< option value = "created_at" { { if eq " created_at " $ . form . EntryOrder } } selected = "selected" { { end } } > {{ t "form.prefs.select.created_time" }}< / option >
< / select >
2024-01-25 14:22:18 +08:00
2023-09-11 11:35:08 -07:00
< label for = "form-categories-sorting-order" > {{ t "form.prefs.label.categories_sorting_order" }}< / label >
< select id = "form-categories-sorting-order" name = "categories_sorting_order" >
{{ range $key, $value := .categories_sorting_options }}
< option value = "{{ $key }}" { { if eq $ key $ . form . CategoriesSortingOrder } } selected = "selected" { { end } } > {{ t $value }}< / option >
{{ end }}
< / select >
< label for = "form-gesture-nav" > {{ t "form.prefs.label.gesture_nav" }}< / label >
< select id = "form-gesture-nav" name = "gesture_nav" >
< option value = "none" { { if eq " none " $ . form . GestureNav } } selected = "selected" { { end } } > {{ t "form.prefs.select.none" }}< / option >
< option value = "tap" { { if eq " tap " $ . form . GestureNav } } selected = "selected" { { end } } > {{ t "form.prefs.select.tap" }}< / option >
< option value = "swipe" { { if eq " swipe " $ . form . GestureNav } } selected = "selected" { { end } } > {{ t "form.prefs.select.swipe" }}< / option >
< / select >
< label for = "form-entries-per-page" > {{ t "form.prefs.label.entries_per_page" }}< / label >
< input type = "number" name = "entries_per_page" id = "form-entries-per-page" value = "{{ .form.EntriesPerPage }}" min = "1" >
2024-01-25 14:22:18 +08:00
2023-09-11 11:35:08 -07:00
< label > < input type = "checkbox" name = "keyboard_shortcuts" value = "1" { { if . form . KeyboardShortcuts } } checked { { end } } > {{ t "form.prefs.label.keyboard_shortcuts" }}< / label >
2024-01-25 14:22:18 +08:00
2023-09-11 11:35:08 -07:00
< label > < input type = "checkbox" name = "entry_swipe" value = "1" { { if . form . EntrySwipe } } checked { { end } } > {{ t "form.prefs.label.entry_swipe" }}< / label >
2025-05-24 22:46:01 -04:00
< label > < input type = "checkbox" name = "always_open_external_links" value = "1" { { if . form . AlwaysOpenExternalLinks } } checked { { end } } > {{ t "form.prefs.label.always_open_external_links" }}< / label >
2025-06-08 20:47:57 -07:00
< label > < input type = "checkbox" name = "open_external_links_in_new_tab" value = "1" { { if . form . OpenExternalLinksInNewTab } } checked { { end } } > {{ t "form.prefs.label.open_external_links_in_new_tab" }}< / label >
2024-02-04 13:19:50 -08:00
< label for = "form-custom-css" > {{t "form.prefs.label.custom_css" }}< / label >
< textarea id = "form-custom-css" name = "custom_css" cols = "40" rows = "10" spellcheck = "false" > {{ .form.CustomCSS }}< / textarea >
2024-07-03 04:03:49 +00:00
2024-10-05 20:37:30 -07:00
< label for = "form-external-font-hosts" > {{t "form.prefs.label.external_font_hosts" }}< / label >
< input type = "text" id = "form-external-font-hosts" name = "external_font_hosts" spellcheck = "false" value = "{{ .form.ExternalFontHosts }}" >
< div class = "form-help" > {{t "form.prefs.help.external_font_hosts" }}< / div >
2024-10-06 01:54:11 +02:00
< label for = "form-custom-js" > {{t "form.prefs.label.custom_js" }}< / label >
< textarea id = "form-custom-js" name = "custom_js" cols = "40" rows = "10" spellcheck = "false" > {{ .form.CustomJS }}< / textarea >
2024-07-03 04:03:49 +00:00
< div class = "buttons" >
< button type = "submit" class = "button button-primary" data-label-loading = "{{ t " form . submit . saving " } } " > {{ t "action.update" }}< / button >
< / div >
< / fieldset >
< fieldset >
< legend > {{ t "form.prefs.fieldset.global_feed_settings" }}< / legend >
< div class = "form-label-row" >
2025-06-19 14:45:46 -07:00
< label for = "form-block-filter-rules" >
{{ t "form.feed.label.block_filter_entry_rules" }}
2024-07-03 04:03:49 +00:00
< / label >
2024-07-17 04:30:49 +02:00
2025-06-19 14:45:46 -07:00
< a href = " https://miniflux.app/docs/rules.html#filtering-rules" { { if $ . user . OpenExternalLinksInNewTab } } target = "_blank" { { end } } >
2024-07-17 04:30:49 +02:00
{{ icon "external-link" }}
< / a >
2024-07-03 04:03:49 +00:00
< / div >
2025-06-19 14:45:46 -07:00
< textarea id = "form-block-filter-rules" name = "block_filter_entry_rules" cols = "40" rows = "10" spellcheck = "false" > {{ .form.BlockFilterEntryRules }}< / textarea >
2024-07-17 04:30:49 +02:00
2024-07-03 04:03:49 +00:00
< div class = "form-label-row" >
2025-06-19 14:45:46 -07:00
< label for = "form-keep-filter-rules" >
{{ t "form.feed.label.keep_filter_entry_rules" }}
2024-07-03 04:03:49 +00:00
< / label >
2025-06-19 14:45:46 -07:00
< a href = " https://miniflux.app/docs/rules.html#filtering-rules" { { if $ . user . OpenExternalLinksInNewTab } } target = "_blank" { { end } } >
2024-07-17 04:30:49 +02:00
{{ icon "external-link" }}
< / a >
2024-07-03 04:03:49 +00:00
< / div >
2025-06-19 14:45:46 -07:00
< textarea id = "form-keep-filter-rules" name = "keep_filter_entry_rules" cols = "40" rows = "10" spellcheck = "false" > {{ .form.KeepFilterEntryRules }}< / textarea >
2024-07-03 04:03:49 +00:00
2023-09-11 11:35:08 -07:00
< div class = "buttons" >
< button type = "submit" class = "button button-primary" data-label-loading = "{{ t " form . submit . saving " } } " > {{ t "action.update" }}< / button >
< / div >
< / fieldset >
2017-11-19 21:10:04 -08:00
< / form >
{{ end }}