_blogs
// blogs / 20260715.md
// blogs / 20260715.md
Dev Log: July 15 Wrap-up
Overview
Today was one of those days where I bounced between writing recursive logic for backend filters and tweaking CSS to get a dashboard looking just right. Most of my energy went into making our lead categorization smarter and improving the 'snappiness' of the main CRM interface.
What I Worked On
Rethinking Lead Categorization
I spent a good chunk of time in our lead filtering logic. We had some simple flags for identifying 'demo' or 'proposal' leads, but they weren't cutting it for the complex ways our users track follow-ups.
I implemented a recursive method to traverse our filter expressions and swap out these simple flags for more detailed criteria. Instead of a basic boolean check, I'm now using an approach that digs into the nested follow-up history to check for specific statuses like 'Closed' or 'Completed' alongside the action type. It keeps the high-level API clean while doing the heavy lifting under the hood.
private Expression refineFilter(Expression expression) {
if (expression == null) return null;
if (expression.isSimple()) {
if ("is_target_lead".equals(expression.getVariable())) {
// Swap simple flag for complex nested object match
var detailedMatch = new Document("action", "target_type")
.append("status", new Document("$in", List.of("Done", "Finalized")));
return new Expression("nested_history", REL_OP.EQ, detailedMatch);
}
return expression;
}
// Traverse the tree recursively
return new Expression(
refineFilter(expression.getLeftExpression()),
expression.getOperator(),
refineFilter(expression.getRightExpression())
);
}
Dashboard UX and 'Async' Everything
Our main dashboard had a full-page loading overlay that was starting to feel a bit intrusive. If one scorecard was slow, the whole page stayed locked. I refactored the loader state to be card-specific. Now, the dashboard frame loads instantly, and each individual metric or chart shows its own spinner. It feels significantly faster even if the data takes the same amount of time to arrive.
I also took a pass at the CSS. Swapped the primary banner color from a harsh red to a more professional deep blue and cleaned up some alignment issues on smaller screens. The multiselect dropdowns also got some love—they were looking a bit too 'default' and now blend in better with our custom theme.
Helpdesk Filtering and Reports
A small but important win for the helpdesk dashboard: I fixed a mapping issue where selecting a specific account didn't filter the corresponding facility list. It was a classic UX annoyance where you'd see irrelevant facilities in the dropdown after choosing an account. I added a dynamic map to track these relationships on the fly so the UI stays relevant to what the user is actually looking for.
Lastly, I added a 'Question Name' column to the feedback worklist report and updated the SLA breakdown labels on the project tracker. These are minor config changes, but they make the data actually readable for the people using these reports every day.
Wrapping Up
Overall, the UI feels a lot more polished today. It's satisfying when you can take a clunky 'loading' experience and turn it into something that feels responsive. Tomorrow, I'll likely be looking into some performance tuning for the report generation—adding more columns is great, but I want to make sure it doesn't crawl under load. Catch you then.