Reply desk
The queue for a practice's client email. It shows who is waiting for a reply, and when that reply is due. One person signs in and works that queue.
Why it exists
Client email used to be a table in a file. The due time was calculated when someone read the file, and that number could sit there after it was wrong. The next reply still depended on remembering to look. Reply desk is that queue on a screen.
A client email starts a clock. The reply is due 24 hours after the clock starts. From Monday to Friday, 08:00 to 20:00 Europe/London, the clock starts when the email arrives. Mail that arrives in the evening or at the weekend starts at 08:00 on the next working morning. The due time is calculated when the queue is opened. It is not stored.
The reply is sent from the screen, or sent from Mail and then marked sent. A draft can sit on the row while the reply is written. The draft does not stop the clock. Answered threads stay on History, each message in the order it was sent.
What the screen shows
- Open queue: each row is one client email with no reply yet. It shows the company, the contact, the summary, and when the reply is due.
- Clock note: the note opens as a timeline. A reply on that timeline shows how long it took from the clock start.
- Reply: the earlier thread scrolls, oldest first. The subject, the body, and a file stay at the bottom of the window.
- Draft: one draft per open row. Saving it leaves the row open. An unchanged draft closes without asking.
- History: closed threads, newest first. The same timeline shows each message as it was pasted.
How the panel is shaped
Filament is the screen. Companies and contacts are resources. The open queue and History are one resource, with form(), table(), and a relation manager for the replies. The open list is the panel home.
Companies and contacts come from HubSpot, or from local stand-in tables when HubSpot is not connected. The screen is the same either way. The desk creates no company and no contact. A match that is not exactly one stops. One administrator signs in. The queue stays closed until that sign-in.
The copy that can be shown uses those local tables, with no token and no real names. It seeds two stand-in companies, one overdue row, one open row, and a draft on the overdue row. Laravel Sail runs that copy in Docker.
Repository
The public repository is github.com/iammikek/reply-desk. The README has the purpose, the Sail steps, and composer test. GitHub Actions runs that suite on every push.