Web-parity pass: OpenPlural import/export, archive, subgroups, support page, +more#12
Merged
Merged
Conversation
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.
This was referenced Jun 24, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
.jsonor.openplural.zip(with images). Near-clone of the Sheaf importer (same preview/options/poll flow); singleopenplural_filesource for both forms. Wired into the Data import menu.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:testPlayReleaseUnitTestpass;:app:assemblePlayReleasegreen through R8. Em-dash-free.parent_id), andsupport_custom_textmust be deployed, or those surfaces error for users on this build.