Skip to content

Web-parity pass: OpenPlural import/export, archive, subgroups, support page, +more#12

Merged
SiteRelEnby merged 13 commits into
mainfrom
feat/openplural-and-web-parity
Jun 23, 2026
Merged

Web-parity pass: OpenPlural import/export, archive, subgroups, support page, +more#12
SiteRelEnby merged 13 commits into
mainfrom
feat/openplural-and-web-parity

Conversation

@SiteRelEnby

Copy link
Copy Markdown
Collaborator

A batch bringing the Android client up to parity with recent web/backend landings. Larger than usual by request (bundled rather than split).

OpenPlural import/export

  • Import: new source reading an OpenPlural .json or .openplural.zip (with images). Near-clone of the Sheaf importer (same preview/options/poll flow); single openplural_file source for both forms. Wired into the Data import menu.
  • Export: the old "Export All Data" item becomes a dedicated Export data screen with a format picker (Sheaf / OpenPlural), a quick JSON-only export (GET /v1/export?format=), and the previously-missing async full-backup-with-images flow: step-up password/TOTP, POST /v1/export/jobs, a Recent backups list that polls while building, and a streamed download.

Member archive

Reversible soft-hide (distinct from delete). The list endpoint returns archived members, so the client filters them out of the main roster and shows them in a collapsible Archived section with Unarchive. Archive lives in the per-member long-press menu; it tries without credentials and only prompts for password/TOTP if the instance's archive safety category is on.

Subgroups

The group model already had parent_id; this wires the UI. The group editor gets a Parent group picker (excluding the group itself and its descendants; the server also caps depth at 8), and the groups list renders hierarchically, indenting subgroups.

Support page

New Settings → Support: renders the operator's custom markdown text (support_custom_text, HTML stripped server-side), their contact / status / policy links (when set), plus static project source + security-contact links. All from /v1/auth/config.

Formatting help

The shared markdown editor toolbar (bios, journals, group/system descriptions) gains a help button with a quick markdown reference, leading with the soft-line-break vs new-paragraph gotcha.

Front-edit guard

The front history editor now blocks saving an entry whose end time isn't after the start (inline warning + disabled save), matching web. (Android date entry is already picker-based and day-clamped, so web's "flag invalid typed date" has no analogue here.)

Verification

  • :app:testPlayReleaseUnitTest pass; :app:assemblePlayRelease green through R8. Em-dash-free.
  • Backend dependency: OpenPlural endpoints, member archive, subgroups (parent_id), and support_custom_text must be deployed, or those surfaces error for users on this build.
  • Not exercised on a live backend here. Worth a pass on: an OpenPlural round-trip (json + zip), a full-backup export job (step-up + download), archive/unarchive, and creating a nested group.
  • Known minor gap: archived members are filtered from the main members list, but may still appear in some member pickers (e.g. group membership) that consume the full list; the switcher uses top-fronters (already excludes archived). Worth a follow-up sweep.

OpenPlural v0.1 is a cross-app interchange format Sheaf now reads. The
importer mirrors the existing Sheaf importer (same preview shape + async
job/poll flow), differing only in the preview endpoint and that OpenPlural
uses a single import source for both the bare .json and the .openplural.zip
bundle (the runner sniffs the zip magic and unpacks images). Reuses
SheafPreviewSummary/SheafImportResult (the backend returns the Sheaf shape
plus lineage_length, which the preview surfaces). Wired into the Data
settings import menu and nav.
Brings the export surface to web parity. The old Data settings 'Export All
Data' item (sync Sheaf JSON only) becomes a dedicated Export data screen:

- Format selector: Sheaf native or OpenPlural v0.1.
- Export JSON only: synchronous GET /v1/export?format=, streamed straight
  to the chosen file (.json or .openplural.json).
- Build full backup (with images): the async export-job flow that didn't
  exist on Android before. Step-up auth (password, plus TOTP when the
  account has 2FA), POST /v1/export/jobs, then a Recent backups list that
  polls while a job builds and offers a streamed download (.zip /
  .openplural.zip) when ready.

New API methods (export job create/list/get/download, format param on the
sync export) and ExportJobRequest/ExportJobRead models. Removed the now-dead
inline JSON-export plumbing from SettingsViewModel + the Data screen.
…front edits

Web-parity follow-ups:

- Support screen (Settings > Support): operator contact, service status,
  and policy links pulled from /v1/auth/config (all optional), plus static
  project source/issues and security-contact links. Mirrors web's Support
  page.
- Front history editor now blocks saving an entry whose end time is not
  after its start (inline warning + disabled save), matching the web
  edit-front dialog. (Date entry on Android is already picker-based and
  day-clamped, so the web 'flag invalid typed date' fix has no analogue.)
The backend now exposes an operator-authored support_custom_text on
/v1/auth/config (HTML stripped server-side). Render it as markdown at the
top of the Support screen, matching web.
Adds a help button to the shared MarkdownBodyEditor toolbar (member bios,
journals, group + system descriptions) opening a quick markdown reference.
Leads with the line-break gotcha: a single newline doesn't break a line;
use a blank line for a new paragraph or two trailing spaces / a backslash
for a soft break.
Members can now be archived: a reversible soft-hide (distinct from delete,
no grace period). The list endpoint still returns archived members, so the
client filters them out of the main roster and shows them in a collapsible
Archived section with an Unarchive action; archive lives in the per-member
long-press menu. Archiving tries with no credentials and, only if the
instance's archive safety category is on, prompts for password/TOTP and
retries. MemberRead gains archived_at.
The group model already carried parent_id; wire it into the UI. The group
editor gets a Parent group picker (excluding the group itself and its
descendants to prevent cycles; the server also caps nesting depth), and the
groups list now renders hierarchically, indenting subgroups under their
parent.
Web puts archive in the member editor, not just a list action. Add an
Archive/Unarchive button to the member edit screen (existing members), with
the same optimistic-then-step-up auth, so it's discoverable where users
manage a member. The list long-press shortcut stays.
Web parity: archived members are now also viewable and restorable from
Settings > System > Archived members, matching web's archived-members
card, in addition to the members-list section and the editor button.
Archive lived on the editor while Delete lived on the read-only profile
screen, splitting member management across two screens. Move Delete onto
the editor (reusing the detail VM's existing delete path) so Save, Archive,
and Delete sit together; the profile screen is now purely for viewing. The
list long-press menu keeps both as shortcuts.
@SiteRelEnby SiteRelEnby enabled auto-merge June 23, 2026 04:38
@SiteRelEnby SiteRelEnby merged commit b7ca419 into main Jun 23, 2026
1 check passed
@SiteRelEnby SiteRelEnby deleted the feat/openplural-and-web-parity branch June 23, 2026 04:43
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.

1 participant