Skip to content

Tracking: high-impact quick fixes #1083

Description

@nonprofittechy

Goal

Track small, well-scoped changes with disproportionate benefit to users or interview authors. Prioritize correctness, accessibility/internationalization, and common UX friction; avoid research-heavy or architectural work in this list.

Priority fixes — ready to implement

P0

  • Exhibit upload tool - TOC page numbering error #884 — Exhibit upload tool: TOC page numbering error

    • Why: Incorrect page numbers in a legal-document table of contents are a correctness problem, and the likely change is tightly scoped.
    • Implementation notes: ALExhibitList._update_page_numbers() already calculates each exhibit.start_page, including the estimated TOC pages and whether a cover page is inserted, so the remaining bug is likely the DOCX TOC template applying an additional offset. Update the TOC expression to derive the displayed content page from exhibit.start_page plus the cover-page offset only when cover pages are enabled, and add regression coverage for multiple one-page exhibits both with and without cover pages.
  • JS audio button labels don't support translation #1053 — JS audio button labels don't support translation

    • Why: The current controls hard-code English in both visible labels and ARIA labels, affecting every translated interview that enables the audio UI.
    • Implementation notes: data/static/al_audio.js currently builds audio_contents_html with literal Listen, Restart, Pause, and stop strings, so the JS needs translated values supplied at runtime rather than more hard-coded branches. Expose translated labels from YAML/HTML (for example through data attributes or a small JS configuration object) and use the same translated source for both the visible <span> and aria-label values.
  • "About this form" is pulling from "interview_metadata" object but it's only sometimes right #994 — “About this form” can show the wrong original-form link

    • Why: This can direct a user to the wrong underlying court form, and the current code makes the failure mode clear.
    • Implementation notes: about_this_interview_version_info in al_visual.yml chooses MAIN_METADATA from the legacy interview_metadata dictionary before reading original_form, even though the active interview metadata is already available through all_variables(special='metadata'). Prefer the current interview's metadata.original_form and use the legacy interview_metadata structure only as a backwards-compatibility fallback; Look for original form URL in metadata, not just interview_metadata in custom error action #692 is related and may be closable once this is fixed.

P1

  • When using al_nav_sections, don't display a top level section if there are no visible sections underneath #867 — Hide top-level navigation section when all children are hidden

    • Why: Small logic defect with visible impact in any interview using dynamic navigation.
    • Implementation notes: get_visible_al_nav_items() in al_general.py filters hidden child dictionaries into new_sublist but unconditionally appends the parent dictionary even when that list becomes empty. Skip a parent whose list-valued navigation children are all empty after filtering, and add an all children hidden case to test_al_general.py alongside the existing helper coverage.
  • My interviews page should display a waiting animation when the link is clicked #775 — Show a waiting state after clicking a My Interviews form link

    • Why: Prevents the page from appearing unresponsive and discourages repeated clicks that can restart the wait.
    • Implementation notes: session_list_html() renders each form title as an .al-session-form-title anchor directly to interview_url(...), while interview_list.yml currently has click handling only for delete confirmations. Add a handler for those title links that immediately marks the clicked link/row busy and shows a spinner, then ignores subsequent clicks on that same link while allowing the original navigation to proceed.
  • Remove "Listen to page" screen reader from tab order #621 — Remove the “Listen to page” widget from screen-reader/tab navigation

    • Why: The current custom audio buttons are real focusable <button> elements and remain exposed to assistive technology, matching the accessibility concern in the issue.
    • Implementation notes: audio_contents_html in al_audio.js creates the visible Listen/Restart/Pause/Stop controls without removing the active control from the tab order or accessibility tree. If the earlier product decision still stands, mark the custom control group hidden from assistive technology and remove its buttons from keyboard tab order while preserving pointer activation for the low-literacy use case; this could be implemented/tested together with JS audio button labels don't support translation #1053.

P2 / small API and configuration wins

  • Maybe automatically check for presence of feedback.yml in the current package and use it in preference to the global one? #724 — Prefer a package-local feedback.yml when it exists

    • Why: Reduces per-package setup and makes branded/custom feedback behavior work automatically for interview authors.
    • Implementation notes: al_visual.yml currently hard-codes feedback_form = "docassemble.AssemblyLine:feedback.yml" even though package_name is already computed just above it. Check safely for {package_name}:feedback.yml (the repo already uses Docassemble file-path helpers such as path_and_mimetype elsewhere), prefer it when present, and retain the AssemblyLine feedback interview as the fallback.
  • ALDocumentBundle.as_pdf() should accept keyword param to provide a cached file #978 — Allow ALDocumentBundle.as_pdf() to use background-cached files

    • Why: Small API-parity improvement that avoids regenerating documents after background assembly and makes background processing easier to use consistently.
    • Implementation notes: download_list_html(use_previously_cached_files=True) already reuses self._downloadable_files and its cached bundled_pdf, but ALDocumentBundle.as_pdf() only checks its separate self.cache[safe_key] path. Add an equivalent opt-in parameter to as_pdf() that returns the cached bundled PDF when available, with fallback to normal generation, and extend test_aldocument_background_assembly.yml to exercise the new path after the background task completes.

Verify against current main / likely close rather than implement

Needs more detail before it is fully actionable

  • al_custom_error Restart button isn't working #1082al_custom_error restart/new-session button

  • Error screen when copying answer set #1001 — Error screen when copying answer set

    • The current copy path is session_list_html()url_ask(...)interview_list_copy_action; unlike the rename block, the copy action block does not declare only sets, which is one concrete lead worth testing. Because the production failure is intermittent, capture a reliable trigger/server state and regression test before making that speculative change.
  • Add option to open links in new tab from session_list_html #928 — Add option to open links in new tab from session_list_html

    • The current function has no new-tab parameter and its title links are ordinary same-tab anchors, but the issue body is empty. Define whether the option applies only to form-title links or also action links, its default value, and expected target/rel output before implementation.
  • Filter/hide sessions the admin has joined #1052 — Filter/hide sessions an admin has joined

    • The list is produced by get_saved_interview_list() and then rendered by session_list_html(), so filtering can likely happen before HTML generation. The unresolved requirement is which secondary-user sessions must remain visible for true multi-user interviews; define that rule before adding a query/filter condition.
  • "Start over" on hamburger menu not working while on a screen triggered by "recompute" review screen logic #1071 — “Start over” fails during recompute flow

    • The default menu currently points to url_ask(['al_start_over_confirmation', 'al_start_over']), so the suggested client-side confirmation would specifically avoid entering another Docassemble question/action while the interview is mid-process. Confirm that this preserves the desired logged-in/anonymous warning text and test a recompute-triggered screen before treating it as a quick JS-only fix.

Selection rule

A good item for this tracker should normally be finishable in one focused PR, have a clear expected behavior, and improve a shared AssemblyLine component rather than one downstream interview. If investigation reveals broad API design, migration work, or significant backwards-compatibility risk, move it out of this tracker rather than expanding the scope here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions