mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
add a setting to always scroll selected entry to the top of the page, even if it fits entirely on screen (#1088)
This commit is contained in:
@@ -45,18 +45,27 @@ const initialState: EntriesState = {
|
|||||||
|
|
||||||
const getEndpoint = (sourceType: EntrySourceType) =>
|
const getEndpoint = (sourceType: EntrySourceType) =>
|
||||||
sourceType === "category" || sourceType === "tag" ? client.category.getEntries : client.feed.getEntries
|
sourceType === "category" || sourceType === "tag" ? client.category.getEntries : client.feed.getEntries
|
||||||
export const loadEntries = createAsyncThunk<Entries, { source: EntrySource; clearSearch: boolean }, { state: RootState }>(
|
export const loadEntries = createAsyncThunk<
|
||||||
"entries/load",
|
Entries,
|
||||||
async (arg, thunkApi) => {
|
{ source: EntrySource; clearSearch: boolean },
|
||||||
if (arg.clearSearch) thunkApi.dispatch(setSearch(""))
|
{
|
||||||
|
state: RootState
|
||||||
const state = thunkApi.getState()
|
|
||||||
const endpoint = getEndpoint(arg.source.type)
|
|
||||||
const result = await endpoint(buildGetEntriesPaginatedRequest(state, arg.source, 0))
|
|
||||||
return result.data
|
|
||||||
}
|
}
|
||||||
)
|
>("entries/load", async (arg, thunkApi) => {
|
||||||
export const loadMoreEntries = createAsyncThunk<Entries, void, { state: RootState }>("entries/loadMore", async (_, thunkApi) => {
|
if (arg.clearSearch) thunkApi.dispatch(setSearch(""))
|
||||||
|
|
||||||
|
const state = thunkApi.getState()
|
||||||
|
const endpoint = getEndpoint(arg.source.type)
|
||||||
|
const result = await endpoint(buildGetEntriesPaginatedRequest(state, arg.source, 0))
|
||||||
|
return result.data
|
||||||
|
})
|
||||||
|
export const loadMoreEntries = createAsyncThunk<
|
||||||
|
Entries,
|
||||||
|
void,
|
||||||
|
{
|
||||||
|
state: RootState
|
||||||
|
}
|
||||||
|
>("entries/loadMore", async (_, thunkApi) => {
|
||||||
const state = thunkApi.getState()
|
const state = thunkApi.getState()
|
||||||
const { source } = state.entries
|
const { source } = state.entries
|
||||||
const offset =
|
const offset =
|
||||||
@@ -74,7 +83,13 @@ const buildGetEntriesPaginatedRequest = (state: RootState, source: EntrySource,
|
|||||||
tag: source.type === "tag" ? source.id : undefined,
|
tag: source.type === "tag" ? source.id : undefined,
|
||||||
keywords: state.entries.search,
|
keywords: state.entries.search,
|
||||||
})
|
})
|
||||||
export const reloadEntries = createAsyncThunk<void, void, { state: RootState }>("entries/reload", async (arg, thunkApi) => {
|
export const reloadEntries = createAsyncThunk<
|
||||||
|
void,
|
||||||
|
void,
|
||||||
|
{
|
||||||
|
state: RootState
|
||||||
|
}
|
||||||
|
>("entries/reload", async (arg, thunkApi) => {
|
||||||
const state = thunkApi.getState()
|
const state = thunkApi.getState()
|
||||||
thunkApi.dispatch(loadEntries({ source: state.entries.source, clearSearch: false }))
|
thunkApi.dispatch(loadEntries({ source: state.entries.source, clearSearch: false }))
|
||||||
})
|
})
|
||||||
@@ -123,15 +138,18 @@ export const markEntriesUpToEntry = createAsyncThunk<void, Entry, { state: RootS
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
export const markAllEntries = createAsyncThunk<void, { sourceType: EntrySourceType; req: MarkRequest }, { state: RootState }>(
|
export const markAllEntries = createAsyncThunk<
|
||||||
"entries/entry/markAll",
|
void,
|
||||||
async (arg, thunkApi) => {
|
{ sourceType: EntrySourceType; req: MarkRequest },
|
||||||
const endpoint = arg.sourceType === "category" ? client.category.markEntries : client.feed.markEntries
|
{
|
||||||
await endpoint(arg.req)
|
state: RootState
|
||||||
thunkApi.dispatch(reloadEntries())
|
|
||||||
thunkApi.dispatch(reloadTree())
|
|
||||||
}
|
}
|
||||||
)
|
>("entries/entry/markAll", async (arg, thunkApi) => {
|
||||||
|
const endpoint = arg.sourceType === "category" ? client.category.markEntries : client.feed.markEntries
|
||||||
|
await endpoint(arg.req)
|
||||||
|
thunkApi.dispatch(reloadEntries())
|
||||||
|
thunkApi.dispatch(reloadTree())
|
||||||
|
})
|
||||||
export const starEntry = createAsyncThunk("entries/entry/star", (arg: { entry: Entry; starred: boolean }) => {
|
export const starEntry = createAsyncThunk("entries/entry/star", (arg: { entry: Entry; starred: boolean }) => {
|
||||||
client.entry.star({
|
client.entry.star({
|
||||||
id: arg.entry.id,
|
id: arg.entry.id,
|
||||||
@@ -175,19 +193,17 @@ export const selectEntry = createAsyncThunk<
|
|||||||
if (arg.scrollToEntry) {
|
if (arg.scrollToEntry) {
|
||||||
const entryElement = document.getElementById(Constants.dom.entryId(entry))
|
const entryElement = document.getElementById(Constants.dom.entryId(entry))
|
||||||
if (entryElement) {
|
if (entryElement) {
|
||||||
const scrollSpeed = state.user.settings?.scrollSpeed
|
const alwaysScrollToEntry = state.user.settings?.alwaysScrollToEntry
|
||||||
thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(true))
|
const entryEntirelyVisible = Constants.layout.isTopVisible(entryElement) && Constants.layout.isBottomVisible(entryElement)
|
||||||
scrollToEntry(entryElement, scrollSpeed, () => thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(false)))
|
if (alwaysScrollToEntry || !entryEntirelyVisible) {
|
||||||
|
const scrollSpeed = state.user.settings?.scrollSpeed
|
||||||
|
thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(true))
|
||||||
|
scrollToEntry(entryElement, scrollSpeed, () => thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(false)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const scrollToEntry = (entryElement: HTMLElement, scrollSpeed: number | undefined, onScrollEnded: () => void) => {
|
const scrollToEntry = (entryElement: HTMLElement, scrollSpeed: number | undefined, onScrollEnded: () => void) => {
|
||||||
// the entry is entirely visible, no need to scroll
|
|
||||||
if (Constants.layout.isTopVisible(entryElement) && Constants.layout.isBottomVisible(entryElement)) {
|
|
||||||
onScrollEnded()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const scrollArea = document.getElementById(Constants.dom.mainScrollAreaId)
|
const scrollArea = document.getElementById(Constants.dom.mainScrollAreaId)
|
||||||
if (scrollArea) {
|
if (scrollArea) {
|
||||||
scrollToWithCallback({
|
scrollToWithCallback({
|
||||||
@@ -248,7 +264,13 @@ export const selectNextEntry = createAsyncThunk<
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
export const tagEntry = createAsyncThunk<void, TagRequest, { state: RootState }>("entries/entry/tag", async (arg, thunkApi) => {
|
export const tagEntry = createAsyncThunk<
|
||||||
|
void,
|
||||||
|
TagRequest,
|
||||||
|
{
|
||||||
|
state: RootState
|
||||||
|
}
|
||||||
|
>("entries/entry/tag", async (arg, thunkApi) => {
|
||||||
await client.entry.tag(arg)
|
await client.entry.tag(arg)
|
||||||
thunkApi.dispatch(reloadTags())
|
thunkApi.dispatch(reloadTags())
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -80,6 +80,17 @@ export const changeScrollMarks = createAsyncThunk<
|
|||||||
if (!settings) return
|
if (!settings) return
|
||||||
client.user.saveSettings({ ...settings, scrollMarks })
|
client.user.saveSettings({ ...settings, scrollMarks })
|
||||||
})
|
})
|
||||||
|
export const changeAlwaysScrollToEntry = createAsyncThunk<
|
||||||
|
void,
|
||||||
|
boolean,
|
||||||
|
{
|
||||||
|
state: RootState
|
||||||
|
}
|
||||||
|
>("settings/alwaysScrollToEntry", (alwaysScrollToEntry, thunkApi) => {
|
||||||
|
const { settings } = thunkApi.getState().user
|
||||||
|
if (!settings) return
|
||||||
|
client.user.saveSettings({ ...settings, alwaysScrollToEntry })
|
||||||
|
})
|
||||||
export const changeSharingSetting = createAsyncThunk<
|
export const changeSharingSetting = createAsyncThunk<
|
||||||
void,
|
void,
|
||||||
{ site: keyof SharingSettings; value: boolean },
|
{ site: keyof SharingSettings; value: boolean },
|
||||||
@@ -136,6 +147,10 @@ export const userSlice = createSlice({
|
|||||||
if (!state.settings) return
|
if (!state.settings) return
|
||||||
state.settings.scrollMarks = action.meta.arg
|
state.settings.scrollMarks = action.meta.arg
|
||||||
})
|
})
|
||||||
|
builder.addCase(changeAlwaysScrollToEntry.pending, (state, action) => {
|
||||||
|
if (!state.settings) return
|
||||||
|
state.settings.alwaysScrollToEntry = action.meta.arg
|
||||||
|
})
|
||||||
builder.addCase(changeSharingSetting.pending, (state, action) => {
|
builder.addCase(changeSharingSetting.pending, (state, action) => {
|
||||||
if (!state.settings) return
|
if (!state.settings) return
|
||||||
state.settings.sharingSettings[action.meta.arg.site] = action.meta.arg.value
|
state.settings.sharingSettings[action.meta.arg.site] = action.meta.arg.value
|
||||||
@@ -146,6 +161,7 @@ export const userSlice = createSlice({
|
|||||||
changeScrollSpeed.fulfilled,
|
changeScrollSpeed.fulfilled,
|
||||||
changeShowRead.fulfilled,
|
changeShowRead.fulfilled,
|
||||||
changeScrollMarks.fulfilled,
|
changeScrollMarks.fulfilled,
|
||||||
|
changeAlwaysScrollToEntry.fulfilled,
|
||||||
changeSharingSetting.fulfilled
|
changeSharingSetting.fulfilled
|
||||||
),
|
),
|
||||||
() => {
|
() => {
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ export interface Settings {
|
|||||||
customCss?: string
|
customCss?: string
|
||||||
customJs?: string
|
customJs?: string
|
||||||
scrollSpeed: number
|
scrollSpeed: number
|
||||||
|
alwaysScrollToEntry: boolean
|
||||||
sharingSettings: SharingSettings
|
sharingSettings: SharingSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
import { Trans } from "@lingui/macro"
|
import { Trans } from "@lingui/macro"
|
||||||
import { Divider, Select, SimpleGrid, Stack, Switch } from "@mantine/core"
|
import { Divider, Select, SimpleGrid, Stack, Switch } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "app/constants"
|
||||||
import { changeLanguage, changeScrollMarks, changeScrollSpeed, changeSharingSetting, changeShowRead } from "app/slices/user"
|
import {
|
||||||
|
changeAlwaysScrollToEntry,
|
||||||
|
changeLanguage,
|
||||||
|
changeScrollMarks,
|
||||||
|
changeScrollSpeed,
|
||||||
|
changeSharingSetting,
|
||||||
|
changeShowRead,
|
||||||
|
} from "app/slices/user"
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
import { useAppDispatch, useAppSelector } from "app/store"
|
||||||
import { SharingSettings } from "app/types"
|
import { SharingSettings } from "app/types"
|
||||||
import { locales } from "i18n"
|
import { locales } from "i18n"
|
||||||
@@ -11,6 +18,7 @@ export function DisplaySettings() {
|
|||||||
const scrollSpeed = useAppSelector(state => state.user.settings?.scrollSpeed)
|
const scrollSpeed = useAppSelector(state => state.user.settings?.scrollSpeed)
|
||||||
const showRead = useAppSelector(state => state.user.settings?.showRead)
|
const showRead = useAppSelector(state => state.user.settings?.showRead)
|
||||||
const scrollMarks = useAppSelector(state => state.user.settings?.scrollMarks)
|
const scrollMarks = useAppSelector(state => state.user.settings?.scrollMarks)
|
||||||
|
const alwaysScrollToEntry = useAppSelector(state => state.user.settings?.alwaysScrollToEntry)
|
||||||
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
|
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
|
|
||||||
@@ -32,6 +40,12 @@ export function DisplaySettings() {
|
|||||||
onChange={e => dispatch(changeScrollSpeed(e.currentTarget.checked))}
|
onChange={e => dispatch(changeScrollSpeed(e.currentTarget.checked))}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
label={<Trans>Always scroll selected entry to the top of the page, even if it fits entirely on screen</Trans>}
|
||||||
|
checked={alwaysScrollToEntry}
|
||||||
|
onChange={e => dispatch(changeAlwaysScrollToEntry(e.currentTarget.checked))}
|
||||||
|
/>
|
||||||
|
|
||||||
<Switch
|
<Switch
|
||||||
label={<Trans>Show feeds and categories with no unread entries</Trans>}
|
label={<Trans>Show feeds and categories with no unread entries</Trans>}
|
||||||
checked={showRead}
|
checked={showRead}
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "إداري"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "الكل"
|
msgstr "الكل"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "تم إرسال بريد إلكتروني إذا تم تسجيل هذا العنوان. "
|
msgstr "تم إرسال بريد إلكتروني إذا تم تسجيل هذا العنوان. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Administrador"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tot"
|
msgstr "Tot"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "S'ha enviat un correu electrònic si aquesta adreça estava registrada. "
|
msgstr "S'ha enviat un correu electrònic si aquesta adreça estava registrada. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Správce"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Všechny"
|
msgstr "Všechny"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Pokud byla tato adresa zaregistrována, byl odeslán e-mail. "
|
msgstr "Pokud byla tato adresa zaregistrována, byl odeslán e-mail. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Gweinyddol"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Pawb"
|
msgstr "Pawb"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Mae e-bost wedi'i anfon os oedd y cyfeiriad hwn wedi'i gofrestru. "
|
msgstr "Mae e-bost wedi'i anfon os oedd y cyfeiriad hwn wedi'i gofrestru. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr ""
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Der er sendt en e-mail, hvis denne adresse var registreret. "
|
msgstr "Der er sendt en e-mail, hvis denne adresse var registreret. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Verwaltung"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Eine E-Mail wurde gesendet, wenn diese Adresse registriert wurde. "
|
msgstr "Eine E-Mail wurde gesendet, wenn diese Adresse registriert wurde. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Admin"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "All"
|
msgstr "All"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "An email has been sent if this address was registered. Check your inbox."
|
msgstr "An email has been sent if this address was registered. Check your inbox."
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Administrador"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todo"
|
msgstr "Todo"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Se ha enviado un correo electrónico si se registró esta dirección. "
|
msgstr "Se ha enviado un correo electrónico si se registró esta dirección. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "مدیر"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "همه"
|
msgstr "همه"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "اگر این آدرس ثبت شده باشد ایمیل ارسال شده است. "
|
msgstr "اگر این آدرس ثبت شده باشد ایمیل ارسال شده است. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Järjestelmänvalvoja"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Kaikki"
|
msgstr "Kaikki"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Sähköposti on lähetetty, jos tämä osoite on rekisteröity. "
|
msgstr "Sähköposti on lähetetty, jos tämä osoite on rekisteröity. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Administrateur"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tout"
|
msgstr "Tout"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Un e-mail a été envoyé si cette adresse est enregistrée. Vérifiez votre boîte de réception."
|
msgstr "Un e-mail a été envoyé si cette adresse est enregistrée. Vérifiez votre boîte de réception."
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Administración"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Enviouse un correo electrónico se este enderezo estaba rexistrado. "
|
msgstr "Enviouse un correo electrónico se este enderezo estaba rexistrado. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr ""
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Mind"
|
msgstr "Mind"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "E-mailt küldtünk, ha ez a cím regisztrálva volt. "
|
msgstr "E-mailt küldtünk, ha ez a cím regisztrálva volt. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr ""
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Semua"
|
msgstr "Semua"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Email telah dikirim jika alamat ini terdaftar. "
|
msgstr "Email telah dikirim jika alamat ini terdaftar. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Ammin"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tutto"
|
msgstr "Tutto"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "È stata inviata un'e-mail se questo indirizzo è stato registrato. "
|
msgstr "È stata inviata un'e-mail se questo indirizzo è stato registrato. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "管理人"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "全員"
|
msgstr "全員"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "このアドレスが登録されていれば、メールが送信されました。"
|
msgstr "このアドレスが登録されていれば、メールが送信されました。"
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "관리자"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "전체"
|
msgstr "전체"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "이 주소가 등록된 경우 이메일이 전송되었습니다. "
|
msgstr "이 주소가 등록된 경우 이메일이 전송되었습니다. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Pentadbir"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Semua"
|
msgstr "Semua"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "E-mel telah dihantar jika alamat ini didaftarkan. "
|
msgstr "E-mel telah dihantar jika alamat ini didaftarkan. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr ""
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "En e-post er sendt hvis denne adressen var registrert. "
|
msgstr "En e-post er sendt hvis denne adressen var registrert. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Beheerder"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alles"
|
msgstr "Alles"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Er is een e-mail verzonden als dit adres is geregistreerd. "
|
msgstr "Er is een e-mail verzonden als dit adres is geregistreerd. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr ""
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "En e-post er sendt hvis denne adressen var registrert. "
|
msgstr "En e-post er sendt hvis denne adressen var registrert. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Administracja"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Wszystkie"
|
msgstr "Wszystkie"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "E-mail został wysłany, jeśli ten adres został zarejestrowany. "
|
msgstr "E-mail został wysłany, jeśli ten adres został zarejestrowany. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Administrador"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Um email foi enviado se este endereço foi registrado. "
|
msgstr "Um email foi enviado se este endereço foi registrado. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Админ"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Все"
|
msgstr "Все"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Электронное письмо было отправлено, если этот адрес был зарегистрирован. "
|
msgstr "Электронное письмо было отправлено, если этот адрес был зарегистрирован. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Správca"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Všetky"
|
msgstr "Všetky"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "E-mail bol odoslaný, ak bola táto adresa zaregistrovaná. "
|
msgstr "E-mail bol odoslaný, ak bola táto adresa zaregistrovaná. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr ""
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alla"
|
msgstr "Alla"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Ett e-postmeddelande har skickats om denna adress var registrerad. "
|
msgstr "Ett e-postmeddelande har skickats om denna adress var registrerad. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "Yönetici"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tümü"
|
msgstr "Tümü"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "Bu adres kayıtlıysa bir e-posta gönderildi. "
|
msgstr "Bu adres kayıtlıysa bir e-posta gönderildi. "
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ msgstr "管理员"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "全部"
|
msgstr "全部"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Always scroll selected entry to the top of the page, even if it fits entirely on screen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "An email has been sent if this address was registered. Check your inbox."
|
msgid "An email has been sent if this address was registered. Check your inbox."
|
||||||
msgstr "如果此地址已注册,则已发送电子邮件。"
|
msgstr "如果此地址已注册,则已发送电子邮件。"
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ public class UserSettings extends AbstractModel {
|
|||||||
@Column(name = "scroll_speed")
|
@Column(name = "scroll_speed")
|
||||||
private int scrollSpeed;
|
private int scrollSpeed;
|
||||||
|
|
||||||
|
private boolean alwaysScrollToEntry;
|
||||||
|
|
||||||
private boolean email;
|
private boolean email;
|
||||||
private boolean gmail;
|
private boolean gmail;
|
||||||
private boolean facebook;
|
private boolean facebook;
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ public class Settings implements Serializable {
|
|||||||
@ApiModelProperty(value = "user's preferred scroll speed when navigating between entries", required = true)
|
@ApiModelProperty(value = "user's preferred scroll speed when navigating between entries", required = true)
|
||||||
private int scrollSpeed;
|
private int scrollSpeed;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "always scroll selected entry to the top of the page, even if it fits entirely on screen", required = true)
|
||||||
|
private boolean alwaysScrollToEntry;
|
||||||
|
|
||||||
@ApiModelProperty(value = "sharing settings", required = true)
|
@ApiModelProperty(value = "sharing settings", required = true)
|
||||||
private SharingSettings sharingSettings = new SharingSettings();
|
private SharingSettings sharingSettings = new SharingSettings();
|
||||||
|
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ public class UserREST {
|
|||||||
s.setCustomJs(settings.getCustomJs());
|
s.setCustomJs(settings.getCustomJs());
|
||||||
s.setLanguage(settings.getLanguage());
|
s.setLanguage(settings.getLanguage());
|
||||||
s.setScrollSpeed(settings.getScrollSpeed());
|
s.setScrollSpeed(settings.getScrollSpeed());
|
||||||
|
s.setAlwaysScrollToEntry(settings.isAlwaysScrollToEntry());
|
||||||
} else {
|
} else {
|
||||||
s.setReadingMode(ReadingMode.unread.name());
|
s.setReadingMode(ReadingMode.unread.name());
|
||||||
s.setReadingOrder(ReadingOrder.desc.name());
|
s.setReadingOrder(ReadingOrder.desc.name());
|
||||||
@@ -120,6 +121,7 @@ public class UserREST {
|
|||||||
s.setScrollMarks(true);
|
s.setScrollMarks(true);
|
||||||
s.setLanguage("en");
|
s.setLanguage("en");
|
||||||
s.setScrollSpeed(400);
|
s.setScrollSpeed(400);
|
||||||
|
s.setAlwaysScrollToEntry(false);
|
||||||
}
|
}
|
||||||
return Response.ok(s).build();
|
return Response.ok(s).build();
|
||||||
}
|
}
|
||||||
@@ -145,6 +147,7 @@ public class UserREST {
|
|||||||
s.setCustomJs(settings.getCustomJs());
|
s.setCustomJs(settings.getCustomJs());
|
||||||
s.setLanguage(settings.getLanguage());
|
s.setLanguage(settings.getLanguage());
|
||||||
s.setScrollSpeed(settings.getScrollSpeed());
|
s.setScrollSpeed(settings.getScrollSpeed());
|
||||||
|
s.setAlwaysScrollToEntry(settings.isAlwaysScrollToEntry());
|
||||||
|
|
||||||
s.setEmail(settings.getSharingSettings().isEmail());
|
s.setEmail(settings.getSharingSettings().isEmail());
|
||||||
s.setGmail(settings.getSharingSettings().isGmail());
|
s.setGmail(settings.getSharingSettings().isGmail());
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||||
|
|
||||||
|
<changeSet id="always-scroll-to-entry" author="athou">
|
||||||
|
<addColumn tableName="USERSETTINGS">
|
||||||
|
<column name="alwaysScrollToEntry" type="BOOLEAN" defaultValueBoolean="false">
|
||||||
|
<constraints nullable="false" />
|
||||||
|
</column>
|
||||||
|
</addColumn>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -20,5 +20,6 @@
|
|||||||
<include file="changelogs/db.changelog-3.2.xml" />
|
<include file="changelogs/db.changelog-3.2.xml" />
|
||||||
<include file="changelogs/db.changelog-3.5.xml" />
|
<include file="changelogs/db.changelog-3.5.xml" />
|
||||||
<include file="changelogs/db.changelog-3.6.xml" />
|
<include file="changelogs/db.changelog-3.6.xml" />
|
||||||
|
<include file="changelogs/db.changelog-3.8.xml" />
|
||||||
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
Reference in New Issue
Block a user