self was resolving to window.self instead of the View instance
inside the forEach callback, causing self.escapeString to fail.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
EspoCRM resolves note type views via clientDefs.Note.itemViews metadata.
Without this mapping, it looked for SmartRequest/SmartResponse/SmartAction
in the core views path instead of the module path, causing 404 errors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace jQuery text escaping with EspoCRM's built-in View.escapeString()
to maintain consistency with the rest of the codebase.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Espo.Utils.escapeString does not exist in EspoCRM 8.x, causing
TypeError crash when clicking dashlet cards. Use jQuery .text().html()
for XSS-safe HTML escaping instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Cards "תיקים פתוחים" and "דיונים השבוע" showed counts but clicking
revealed "אין פריטים להצגה" because card counts came from direct DB
queries while detail filtered from alerts with stricter criteria.
Added getOpenCaseItems() and getUpcomingHearingItems() to AlertCalculator,
included them in summary API response, and wired dashlet to use them.
Also: renamed extension to SmartAssistant, title to "שירה — עוזרת אישית".
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Merges CrmAssistant + OfficeAssistant into a single module with:
- Floating chat (FAB) with auto office/case mode detection
- CaseMemory entity for persistent per-case knowledge
- save_memory AI tool for proactive memory saving
- Auto-extraction hooks (status changes, hearings)
- AlertCalculator for office-level alerts
- Full conversation persistence via ConversationRepository
- RTL/Hebrew support throughout (fa_IR)
47 files, 0 dependencies on old modules.