Pass customer_rows (list of {id, name} dicts) instead of SQLAlchemy
objects so the Jinja tojson filter can serialize them in JavaScript.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove per-row Link/Create Job button and inline modals
- Make unmatched rows clickable to open a single shared modal
- Create new job tab: customer via datalist (auto-complete),
job name and backup type shown read-only (derived from user/section)
- Route: derive job_name and backup_type server-side, not from form
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- POST /cloud-connect/accounts/scan-inbox: queries all inbox mails with
backup_type 'cloud connect report', calls upsert_cloud_connect_report()
for each, flashes a summary of accounts upserted and runs created
- 'Scan inbox mails' button added to Cloud Connect Accounts page header
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- base.html: hardcode data-bs-theme="dark", remove theme detection JS
and theme selector form from sidebar footer
- layout.css: replace dark/light theme selectors with unconditional
dark background for .bc-main
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace Bootstrap display-6 stats with bc-stat-grid layout:
Inbox card spans 2 columns; status values colored by type
(success=green, warning=yellow, failed=red, override=blue, muted=grey)
- Fix extra </div> that caused large empty space below stats
- Compact Legend to horizontal flex-wrap row
- Move System status card above description text
- Shorten description to 3 paragraphs
- Add bc-stat-grid / bc-stat-card CSS to layout.css
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- settings_orphaned_jobs.html: remove outer container-fluid div (bc-content
already provides padding in the new sidebar layout)
- changelog.html: reduce sticky-top offset from 80px to 24px (no topnav
anymore, only sidebar)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Icon and nav macros were defined after </html> but called earlier in the
template. Jinja2 processes macros sequentially, so moved all macro
definitions to the top of base.html before the <!doctype html> tag.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Redesign layout to fixed dark sidebar (220px) with IBM Plex Sans/Mono
fonts and CSS design tokens; full rewrite of layout.css and base.html
- Move missed-run generation and Autotask ticket polling to a daemon
background thread on Run Checks page load (throttled per job, 10 min)
- Cove manual import now logs and shows per-skip-reason breakdown
- Cove timestamp parser handles ms/us/ns epochs and .NET /Date(ms)/ strings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CoveAccount staging model: all Cove accounts upserted from API;
unmatched accounts visible on /cove/accounts before job linking
- cove_importer.py: always upserts accounts, creates JobRuns only for
accounts with a linked job (deduplication via external_id)
- routes_cove.py: GET /cove/accounts, POST link/unlink routes
- cove_accounts.html: inbox-style page with Bootstrap modals for
creating new jobs or linking to existing ones
- Nav bar: Cove Accounts link for admin/operator when cove_enabled
- DB migration: migrate_cove_accounts_table() for staging table
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New route POST /settings/cove/run-now calls run_cove_import()
directly and shows result as flash message
- Settings > Integrations > Cove: "Run import now" button visible
when partner_id is known (connection confirmed)
- Status bar shows partner ID, last import timestamp or "No import yet"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Login: use lowercase username/password params and id="jsonrpc"
- Login: visa is at top-level of response (not inside result)
- EnumerateAccountStatistics: use lowercase query param, RecordsCount
instead of RecordCount, remove DisplayColumns (not needed)
- _flatten_settings: Settings items are single-key dicts like
{"D09F00": "5"}, not {Key: ..., Value: ...} - use dict.update()
- _cove_enumerate: unwrap nested result and handle Accounts key
- _process_account: AccountId is top-level field, not from Settings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>