The templates button called an endpoint that could not answer

Fixkamo-internal
Shipped
September 6, 2026 at 7:20 PM UTC
Author
Kamo
Commit
9cb90ee

Found by reading the controller rather than the code calling it, and it was broken twice over in a way that LOOKED fine: - The list asked for `status=ACTIVE`. TemplateStatus is REQUIRED | CUSTOM | ARCHIVED -- there is no ACTIVE -- and SmsTemplateController answers an unrecognised value with a 400. So the request always failed, the catch always fired, and the popover always showed its built-in fallbacks. An org that had authored templates saw none of them and nothing said why. No status filter is sent now; ARCHIVED is dropped client-side. - /render reads req.getTemplateKey(), and the call was passing the template's id. Even with a working list, picking a template would have inserted nothing. Addressed by key now, and a summary row without one is not offered at all rather than rendered as a row that does nothing when clicked. Same shape as the rest of this work: every failure was silent. Also in this pass: - The recipient typeahead only ever saw ONE page of conversations. The server clamps a page at 30, so a member with more than that could not be shown the older ones -- and would be offered a NEW thread with somebody they had been texting for months, which is the exact mistake this feature exists to prevent, reappearing for the members who text the most. It pages now (capped at 10) behind a shared cache, so two compose windows do not each walk it. - Arrow-key navigation with a visible highlight, aria-activedescendant and role=option/listbox. The highlight resets whenever the matches change: arrowing down and then typing another digit would otherwise send to whatever landed in that slot. - The button in the recipient field was a BACKSPACE that removed one character -- right beside a twelve-key pad, meaningless beside a text input whose own Backspace already does it, and its aria-label said "Clear" while its icon and behaviour said something else. It clears the field now. - The contact pane's Call button was wired to a no-op, so SoftphoneCRM drew a dead control beside every match it found. - The templates popover closes on an outside click or Escape; it could only be dismissed by picking something or hitting the button again, so a member who opened it to look was left with it covering the thread they were reading. - scrollIntoView is optional-called: keeping a row in view is a nicety, and the API is absent in jsdom and in some embedded webviews. Verified in a real browser this time, not just jsdom (throwaway probe route, reverted): the softphone's five-column tab row measures 5x70.8px with nothing clipped -- VOICEMAIL included, which was the label I had only reasoned about -- typing "714555" lists the existing chain first (titled "John Smith", resolved from contacts by canonical number, with its unread badge), then the second chain by number, then the matching contact; and ArrowDown visibly moves both the highlight and aria-activedescendant.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing