Skip to content

Settings and admin: subscreens for accounts and About, announcement date pickers - #94

Merged
SiteRelEnby merged 6 commits into
mainfrom
feat/settings-subscreens
Sep 26, 2026
Merged

SiteRelEnby merged 6 commits into
mainfrom
feat/settings-subscreens

Conversation

@SiteRelEnby

Copy link
Copy Markdown
Collaborator

Four settings and admin surfaces, all of them about giving things enough room.

Closes #63. Closes #89.

The account list is its own screen

It rendered every account inline, so on an instance with any real number of them the invite codes, announcements and maintenance sections were several screens down, and the search field had scrolled out of sight by the time you reached the results it filtered. The panel now carries a row with the account count that opens a screen holding the search field and the list, and nothing else.

Search waits for a pause in typing before asking. Filtering is server-side, so "alex" used to be four requests, three of them stale by the time they landed.

The user actions moved into their own view model rather than sharing the panel's, so opening the screen doesn't re-fetch stats, invites and announcements to show a list of accounts.

Announcement scheduling, and the login page (#89)

The start and expiry wanted a hand-typed 2026-12-31T00:00:00Z. One typo and the server rejected the whole announcement, and getting it right meant doing the UTC conversion yourself. Both are now a checkbox, a date picker and a time row, seeded through the same helpers that keep the front history picker from landing a day early. The invite code expiry had the identical field and gets the same treatment.

visible_while_logged_out has existed server-side since 0.2.0 and was simply absent from the Android models, so an announcement meant for the login page could only be set up from the web client. It's a checkbox in the editor and a marker in the list, matching the web.

Unticking a schedule now sends the clear flag. PATCH treats an omitted timestamp as "leave it alone", so without it, removing a start or expiry looked like it saved and silently didn't.

About has a screen (#63)

The row packed version, commit, build time and flavour onto one ellipsised line, so on a narrow screen the commit was cut off and the only way to read it was to turn the phone sideways. Each fact is now its own row, wraps instead of truncating, and copies to the clipboard. It carries the full commit hash rather than the short one, since that's what a bug report wants.

There's a Server section with the instance address and whatever the instance reports about itself: version, tag, commit, build time and mode. A server that says nothing gets an explanation and a retry rather than a blank space, because "older than the version endpoint" and "couldn't be reached" look identical from the client.

Long custom field names

ListItem hands its trailing slot the width it asks for and gives the headline what's left. With a privacy chip and three icon buttons in there, a long field name was left a column one character wide and spelled itself vertically down the screen. The chip moves down beside the field type, and the name is capped at two lines so nothing added to that slot later can collapse it again.

Same shape as the fix on a member's profile in 1.3.x. Groups never had it, because the name gets a weighted column of its own there; tags and front history don't use the pattern at all.

Testing

TimeInputRow moved into the shared components package so the announcement editor and the front history sheet use one implementation rather than two copies.

Three new contract tests cover the announcement wire format, including the clear flag and the snake_case mapping that would otherwise make the new checkbox a no-op. Nothing new for the two layout fixes: both were invisible to the compiler and the suite, and the honest answer for catching a third one is a screenshot harness rather than another hand-placed maxLines.

About verified on a device. The admin screens need a reachable backend and want a look before merge.

The users section rendered every account inline, so on an instance with
any real number of them the invite codes, announcements and maintenance
sections below it were several screens down, and the search field had
scrolled out of sight by the time you reached the results it filtered.

The panel now carries a row with the account count that opens a screen
holding the search field and nothing else. Search also waits for a pause
in typing before asking: filtering is server-side, so "alex" used to be
four requests, three of them stale on arrival.
Closes #89.

The schedule fields wanted a hand-typed "2026-12-31T00:00:00Z". One typo
and the server rejected the whole announcement, and getting it right
meant doing the UTC conversion yourself. Both are now a checkbox, a date
picker and a time row, seeded through the shared helpers that already
keep the front-history picker from landing a day early. The invite code
expiry had the same free-text field and gets the same treatment.

Visible-while-logged-out has existed server-side since 0.2.0 and was
simply absent from the Android models, so an announcement meant for the
login page could only be set up from the web client. It is a checkbox in
the editor and a marker in the list, matching the web.

Unticking a schedule now sends the clear flag: PATCH treats an omitted
timestamp as "leave it alone", so without it a removed start or expiry
came straight back.
Closes #63.

The About row packed version, commit, build time and flavour onto one
ellipsised line, so on a narrow screen the commit was cut off and the
only way to read it was to turn the phone sideways. Tapping it now opens
a screen where each fact is its own row, wraps instead of truncating,
and copies to the clipboard.

It carries the full commit hash rather than the short one, since that is
what a bug report wants, and a Server section with the instance address
and whatever the instance reports about itself: version, tag, commit,
build time and mode. A server that says nothing gets an explanation and
a retry rather than a blank space, because "too old to answer" and
"couldn't be reached" look identical from here.
The custom fields list put a privacy chip and three icon buttons in the
row's trailing slot. ListItem hands that slot the width it asks for and
gives the headline whatever is left, which on a narrow screen was about
one character: "Primary Source(s)" rendered as a vertical column of
letters. Reported from the field.

The chip moves down beside the field type, where it has a line to
itself, leaving only the three buttons trailing. The name is capped at
two lines with an ellipsis so nothing added to that slot later can
collapse it again.

Same shape as the fix on a member's profile, and as the groups list,
which never had the problem because it gives the name a weighted column
of its own.
@SiteRelEnby
SiteRelEnby merged commit 465f5ed into main Sep 26, 2026
1 check passed
@SiteRelEnby
SiteRelEnby deleted the feat/settings-subscreens branch September 26, 2026 03:06
fullynocturnal added a commit that referenced this pull request Sep 26, 2026
#94 made TimeInputRow shared so every screen asks for a time of day the
same way. Now that history uses the Material time picker, move it into
ui/components as TimePickerButton and switch the admin schedule fields
(announcement start and expiry, invite code expiry) over to it, so both
screens still match. TimeInputRow has no callers left and is removed.

Also adds changelog entries for the time picker and the shorter member
list, and updates #94's entry to say time picker.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Admin panel notification editor settings > about improvements

1 participant