Composer refinement + unification: center modal, NLDD alignment, rename card-less to new, unify with reply composer #195
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
PR #192 (#192) landed the
new-message composer (compose a message to a channel or person, independent of a
saved card). This issue tracks the refinement + unification round that came out
of the review and local testing. To be done as one coherent effort (in #192 or a
dedicated refactor PR).
Scope
ComposeOverlayuses a native<dialog>that renders top-aligned;CardDetailsModalis a centered customoverlay (
.overlay{position:fixed;inset:0;flex-center}+.modal). Mirrorthat pattern (optionally a shared
Modal.vue), withuseFocusTrap.nldd-dropdown; the"Aan" field ->
nldd-text-field/nldd-search-field(fixes the search-iconoverlapping the placeholder); buttons ->
nldd-button; labels ->nldd-form-field. Only the combobox popup stays custom (NLDD has no combobox).the bare
MarkdownEditor; reuse the full reply editor stack(
FormatToolbar/LinkBar/EmojiPicker).card-less/cardlesstonew(-message) across frontend AND backend(
CardlessMessageCreate/CardlessScheduledCreate/create_scheduled_cardless/
useCreateCardlessScheduled/thecardlessprop/isCardless), and make thereply path explicitly "reply". Single
MAX_FILE_REFS(backend, in everyField(max_length=...)) +MAX_ATTACHMENTS(frontend) constant - the cap iscurrently hardcoded in ~8 places. Decision: not a build-time Vite var (it does
not reach the backend) nor
/api/config(dev-only); two named constants thatreference each other, or a small prod
/api/app-configif a true single sourceis wanted. Extract a shared
AttachmentListcomponent (currently a 2nd copy,missing image thumbnails). Add a
useMessageComposercore unifyingReplyComposer+ComposeOverlay(content + files + validation +send/schedule/undo, strategy injected). This touches the merged, production
reply path -> highest risk; do carefully and run the backend gates.
backend/waggle/integrations/mattermost_dev.py+ adev_synthetic_authgatein
deps.get_mm_client_for_cardmake the composer testable locally without areal Mattermost (fake channels/people/sends). It is currently uncommitted
(used only for the local preview); commit it WITH tests so the 100% backend
coverage gate stays green. Optionally also gate
scheduled_runner._build_mm_client_for_rowfor scheduled sends in dev.Smaller separable follow-ups
account_idyet -> consider adding it to
ScheduledPostRead).Decisions carried in
lib/delayedSend), not a post-send delete.robbertbos referenced this issue2026-07-26 07:04:36 +00:00
Done: the full scope landed on main via #192.
components/Modal.vue(focus-trap + scroll-lock + Escape), used by ComposeOverlay and the other modals.nldd-dropdown/nldd-form-fieldin the overlay; TargetPicker runs onnldd-combo-box+nldd-menu+nldd-icon-button.MessageEditor.vue(editor + toolbar + linkbar + emoji + mentions), used by ComposeOverlay and ReplyComposer alike.MAX_FILE_REFS = 10inconfig.pyis the single source (imported byschemas/outgoing_post.py);AttachmentChipList.vue+attachmentLimits.ts;composables/useMessageComposer.ts.integrations/mattermost_dev.pywithtests/unit/test_mattermost_dev.py.Of the separable follow-ups, the
?shortcut table (ShortcutHelp.vue) andaccount_idonScheduledPostReadare done too. Still open: a Playwright e2e for the composer - unit coverage exists (ComposeOverlay/TargetPicker/MessageEditor) andcomposer-link-formatting/mention-autocompletetouch the editor, but no spec walks target -> send/schedule end to end. Not tracked anywhere else after this close.