- ส่งแล้ว
- 4 สิงหาคม 2569 เวลา 15:03 UTC
- ผู้เขียน
- kamo
- ตั้งค่า
- 16e5cd5
Follow-up to the popup-window persistence work. Each of these was verified against real code first; three of the original reports turned out to be wrong or overstated and were corrected rather than implemented. Content that leaked between conversations (correctness AND confidentiality): - TicketChat kept one `input` across ticket tabs, and handleSend posts to whichever sessionGuid is active — a path to sending one customer's text into another customer's ticket. Now stashes per-ticket drafts. - AiChatInput carried text and staged images into whatever conversation the member switched to. Same stash-and-restore, rather than a blunt reset that would trade a leak for content loss. Content destroyed by an unmount: - Softphone CRM tab, SMS chat tab (attachment + search) and the support ticket creation form were conditional renders, so switching tabs discarded whatever was typed. Kept mounted and hidden (SMS lifts state instead — a display:none subtree reports scrollHeight 0 and would pin its textarea to 0px). - Toggling the meeting button off unmounted MeetingComposer and binned the form. Destructive gestures and silent drops: - The hexhead throw-to-remove goal closed whatever window it scored on, which could bin a minimized compose window with an unsent draft. Closing is now vetoable via a cancelable `tool:requestClose`; MessageTool refuses while it holds unsent content and the throw scores as a miss. - "Save Draft" reported success while discarding attachments. The drafts endpoint takes a JSON EmailSendRequest with no attachment field, so the fix is to say so instead of pretending. NOT changed: htmlBody stays the raw body (the template wrapper is applied at send; storing it wrapped risks a double-wrap), and **************** stay out — verified inert, the draft builders in EmailService never emit those headers. - RecipientField cleared the input unconditionally, so pressing Enter on a mistyped address erased it. Pending text now also rides in the draft, so a reload cannot swallow a half-typed address. - HexHeadPopover's "Email" sent { to, recipientName }, a shape MessageTool never reads, so compose opened with no recipient at all. - A chat relocation dispatched tool:close with no windowId (a no-op in the store) then opened a second window, stranding the typed message. It now re-points the existing window with tool:patchProps. - A member's explicit From-address choice was clobbered when the async alias fetch landed, so they could send from the wrong identity. Not implemented — reported but verified NOT a defect: the template-scope editor rebuild does not lose body text (the parent owns it); it costs caret position and undo history only.