Skip to content

anchors n/n: Open at first unread #1517

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Jun 12, 2025
20 changes: 20 additions & 0 deletions assets/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -951,6 +951,26 @@
"@pollWidgetOptionsMissing": {
"description": "Text to display for a poll when it has no options"
},
"initialAnchorSettingTitle": "Open message feeds at",
"@initialAnchorSettingTitle": {
"description": "Title of setting controlling initial anchor of message list."
},
"initialAnchorSettingDescription": "You can choose whether message feeds open at your first unread message or at the newest messages.",
"@initialAnchorSettingDescription": {
"description": "Description of setting controlling initial anchor of message list."
},
"initialAnchorSettingFirstUnreadAlways": "First unread message",
"@initialAnchorSettingFirstUnreadAlways": {
"description": "Label for a value of setting controlling initial anchor of message list."
},
"initialAnchorSettingFirstUnreadConversations": "First unread message in single conversations, newest message elsewhere",
"@initialAnchorSettingFirstUnreadConversations": {
"description": "Label for a value of setting controlling initial anchor of message list."
},
"initialAnchorSettingNewestAlways": "Newest message",
"@initialAnchorSettingNewestAlways": {
"description": "Label for a value of setting controlling initial anchor of message list."
},
"experimentalFeatureSettingsPageTitle": "Experimental features",
"@experimentalFeatureSettingsPageTitle": {
"description": "Title of settings page for experimental, in-development features"
Expand Down
30 changes: 30 additions & 0 deletions lib/generated/l10n/zulip_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1415,6 +1415,36 @@ abstract class ZulipLocalizations {
/// **'This poll has no options yet.'**
String get pollWidgetOptionsMissing;

/// Title of setting controlling initial anchor of message list.
///
/// In en, this message translates to:
/// **'Open message feeds at'**
String get initialAnchorSettingTitle;

/// Description of setting controlling initial anchor of message list.
///
/// In en, this message translates to:
/// **'You can choose whether message feeds open at your first unread message or at the newest messages.'**
String get initialAnchorSettingDescription;

/// Label for a value of setting controlling initial anchor of message list.
///
/// In en, this message translates to:
/// **'First unread message'**
String get initialAnchorSettingFirstUnreadAlways;

/// Label for a value of setting controlling initial anchor of message list.
///
/// In en, this message translates to:
/// **'First unread message in single conversations, newest message elsewhere'**
String get initialAnchorSettingFirstUnreadConversations;

/// Label for a value of setting controlling initial anchor of message list.
///
/// In en, this message translates to:
/// **'Newest message'**
String get initialAnchorSettingNewestAlways;

/// Title of settings page for experimental, in-development features
///
/// In en, this message translates to:
Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_ar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,23 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'This poll has no options yet.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Experimental features';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_de.dart
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,23 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'This poll has no options yet.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Experimental features';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,23 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'This poll has no options yet.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Experimental features';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_ja.dart
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,23 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'This poll has no options yet.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Experimental features';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_nb.dart
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,23 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'This poll has no options yet.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Experimental features';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_pl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -784,6 +784,23 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'Ta sonda nie ma opcji do wyboru.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Funkcje eksperymentalne';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_ru.dart
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,23 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'В опросе пока нет вариантов ответа.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle =>
'Экспериментальные функции';
Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_sk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -775,6 +775,23 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'This poll has no options yet.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Experimental features';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_uk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,23 @@ class ZulipLocalizationsUk extends ZulipLocalizations {
String get pollWidgetOptionsMissing =>
'У цьому опитуванні ще немає варіантів.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Експериментальні функції';

Expand Down
17 changes: 17 additions & 0 deletions lib/generated/l10n/zulip_localizations_zh.dart
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,23 @@ class ZulipLocalizationsZh extends ZulipLocalizations {
@override
String get pollWidgetOptionsMissing => 'This poll has no options yet.';

@override
String get initialAnchorSettingTitle => 'Open message feeds at';

@override
String get initialAnchorSettingDescription =>
'You can choose whether message feeds open at your first unread message or at the newest messages.';

@override
String get initialAnchorSettingFirstUnreadAlways => 'First unread message';

@override
String get initialAnchorSettingFirstUnreadConversations =>
'First unread message in single conversations, newest message elsewhere';

@override
String get initialAnchorSettingNewestAlways => 'Newest message';

@override
String get experimentalFeatureSettingsPageTitle => 'Experimental features';

Expand Down
9 changes: 8 additions & 1 deletion lib/model/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ class GlobalSettings extends Table {
Column<String> get browserPreference => textEnum<BrowserPreference>()
.nullable()();

Column<String> get visitFirstUnread => textEnum<VisitFirstUnreadSetting>()
.nullable()();

// If adding a new column to this table, consider whether [BoolGlobalSettings]
// can do the job instead (by adding a value to the [BoolGlobalSetting] enum).
// That way is more convenient, when it works, because
Expand Down Expand Up @@ -119,7 +122,7 @@ class AppDatabase extends _$AppDatabase {
// information on using the build_runner.
// * Write a migration in `_migrationSteps` below.
// * Write tests.
static const int latestSchemaVersion = 6; // See note.
static const int latestSchemaVersion = 7; // See note.

@override
int get schemaVersion => latestSchemaVersion;
Expand Down Expand Up @@ -174,6 +177,10 @@ class AppDatabase extends _$AppDatabase {
from5To6: (m, schema) async {
await m.createTable(schema.boolGlobalSettings);
},
from6To7: (m, schema) async {
await m.addColumn(schema.globalSettings,
schema.globalSettings.visitFirstUnread);
},
);

Future<void> _createLatestSchema(Migrator m) async {
Expand Down
Loading