Skip to content

Phase 5+6: Bootstrap 5 / Tabler migration + tech debt resolution - #18

Merged
gru3zi merged 13 commits into
feat/phase3-ace-removalfrom
feat/phase5-bs5-tabler
Jun 24, 2026
Merged

gru3zi merged 13 commits into
feat/phase3-ace-removalfrom
feat/phase5-bs5-tabler

Conversation

@gru3zi

@gru3zi gru3zi commented Jun 23, 2026

Copy link
Copy Markdown
Owner

Summary

Phase 5 — Bootstrap 4→5 + Tabler v1.0.0-beta21 migration (slices 5.0–5.13)

  • 5.0 — Add @tabler/core + @popperjs/core, clean WebFont.load
  • 5.1 — Tabler layout shell: swap Atlantis for Tabler CSS/JS
  • 5.2a/b/c — Atomic BS4→BS5 data-attribute sweep across all templates + JS (data-toggle→data-bs-toggle, data-dismiss→data-bs-dismiss, data-target→data-bs-target, data-ride/slide/spy etc.)
  • 5.3 — BS4→BS5 CSS utility renames (float-right, text-left, font-weight-*, etc.)
  • 5.4 — Tom Select replaces Select2, iris_toast replaces jGrowl, scrollbar CSS
  • 5.5 — DataTables 1.13.8 + Bootstrap 5 integration
  • 5.6 — selectgroup, Flaticon→FontAwesome 5, badge shim, DT className updates
  • 5.7 — Vanilla JS sidebar toggle replaces Atlantis sidebar.js
  • 5.8 — Modal BS5 bridge handles {show:true} + 2 dashboard flaticon fixes
  • 5.9 — Structural layout shim via iris-layout.css
  • 5.10–5.13 — CSS restoration via iris-visual.css: Atlantis visual theming, Lato font, nav-tabs, badges, gradient banners, modal radius

Phase 6 — Tech debt resolution (slices 6.1–6.2)

  • 6.1 — alerts.py: force light-theme vis graph colours (dark-theme.css gated off post-migration; was causing white-on-white node/edge rendering)
  • 6.2 — case_rfile.html: remove dead bootstrap-datetimepicker.min.js script tag (no call sites confirmed)

Security

  • _escape_tooltip_content() preserved in case_timeline_routes.py and business/alerts.py
  • Phase 5 CodeRabbit review addressed (XSS finding in graphql test fixture, BS5 attribute sweep)

Test plan

  • node e2e/diag-phase5-layout.cjs — ALL 15 structural checks PASS
  • node e2e/diag-phase5-qa.cjs — 33/34 PASS (1 pre-existing warn: sidenav-toggler selector)
  • node e2e/style-audit.cjs — 14 diffs, all intentional architectural differences vs upstream
  • Login, dashboard, case (summary/notes/assets/IOC/tasks), manage cases, alerts — functional
  • No data-toggle= JS console errors
  • No broken icon boxes
  • Mobile: hamburger sidebar slides in at 768px

Not in scope (deferred tickets)

  • Dark mode full rewrite (Tabler data-bs-theme)
  • SweetAlert z-index cosmetic fix
  • jQuery UI replacement
  • select2 / amsifySuggestags replacement (confirmed BS5-agnostic)
  • Chart.js v4 migration
  • vis EOL bundle upgrade

🤖 Generated with Claude Code

gru3zi and others added 8 commits June 23, 2026 20:19
Atlantis.min.css removal in 5.1 took the sidebar+main-panel positioning
rules with it. Added iris-layout.css extracted from vendored atlantis.css
to restore .sidebar (position:fixed, 250px), .main-panel (margin-left:250px),
header (z-index:1001), minimized and mobile states. Replaced float:right
(broken inside Tabler's flex .page) with margin-left. All 4 layouts load
the shim after tabler.min.css. Added diag-phase5-layout.cjs automated CSS
layout regression test (sidebar width, main-panel alignment, header height,
overflow, mobile hide). Layout: ALL PASS, QA: 33 pass 0 fail.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extracted visual-only rules from vendored atlantis.css (colors, shadows,
typography) into iris-visual.css — loaded after iris-layout.css. Covers:
sidebar-style-2 active nav pill (#05316a + white text), hover pill
(rgba(199,199,199,0.2) + border-radius), logo-header dark blue background
(data-background-color=blue), btn-toggle/topbar-toggler transparent on
dark header, white hamburger SVG icon, card box-shadow + border:0,
card-header border, body/content background (#f9fbfd), main-header
text/link colors, navbar transparent inside main-header, profile
picture max-width:35px, user block separator + version menu padding.

All 4 layouts load: tabler.min.css → iris-layout.css → iris-visual.css.
Layout check: ALL PASS. QA: 33 pass 0 fail.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docker-compose.ref.yml — spins up ghcr.io/dfir-iris/iriswebapp_app:v2.5.0
on port 8444 (isolated network/volumes) as a visual ground-truth reference.

e2e/style-audit.cjs — Playwright script that logs into both :8443 (fork)
and :8444 (ref), extracts computed CSS for 24 key element/property pairs
across dashboard/manage/case pages, diffs them as JSON, and writes
style-diff.json + style-audit-full.json. Eliminates manual screenshot
review — run after each CSS change to measure remaining delta.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…le headers, modals

Style-audit (style-audit.cjs vs ghcr.io/dfir-iris/iriswebapp_app:latest) flagged:
- body font-family: add Lato via Google Fonts import
- nav-tabs: restore #05316a blue text + 2px solid active indicator (case page tabs)
- .badge: pill shape (border-radius 50px, 5px 10px padding)
- table.dataTable thead th: restore 14px font-size (was 10px via Tabler override)
- .modal-content: 1rem border-radius + proper box-shadow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rol radius

Style-audit round 2:
- table.dataTable thead: transparent bg, #343a40 text, no border (removes Tabler
  light-gray header tint from DataTable column headers)
- .form-control: border-radius 8px, min-height 35px (rounds inputs to match
  Atlantis appearance; Bootstrap input-groups zero the right corners naturally)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…banner backgrounds

Diagnostics revealed .panel-header uses four gradient utility classes that
Atlantis defined but Tabler removed — leaving case/dashboard hero sections
transparent with dark text:

- .bg-close-gradient  → dark navy  (#1f283e, linear-gradient −45°)
- .bg-primary-gradient / .bg-case-gradient → IRIS brand blue (#05316a)
- .bg-shadow-gradient  → dark charcoal gradient

For each: restore background, force white text on all descendants, style
.btn-light/.btn-default as frosted-glass, keep .btn-white solid white.

Also: .btn / .btn-sm global border-radius restore (0.375rem / 0.25rem) to
fix Tabler's 2px square button appearance; .btn-rounded / .badge-pill
kept as pill shapes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
dark-theme.css is gated off in all layouts post-BS5 migration. The
in_dark_mode flag still existed in the vis graph colour helpers, causing
white-on-white node/edge rendering for users with in_dark_mode=True.

Remove both remaining dark-mode branches:
- _get_font(): drop 'if in_dark_mode: return ...' branch → always ''
- _get_icon_ioc(): drop ternary → 'color' always ''

Function signatures preserved; navigation.html already shows a
dismissible dark-mode notice — no template change needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
case_rfile.html loaded bootstrap-datetimepicker.min.js but contained
no .datetimepicker() call sites — the tag was a dead Bootstrap 3/4
remnant. amsifySuggestags confirmed BS5-agnostic, no change needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: db91e415-9527-4f6c-9c33-16b6f7aceb85

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key: "tools"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Comment @coderabbitai help to get the list of available commands.

gru3zi and others added 5 commits June 23, 2026 22:19
…ler/core dropzone peer conflict

npm 10 (Node 20 in CI) fails ERESOLVE because @tabler/core@1.0.0-beta21 declares
peerOptional dropzone@^6.0.0-beta.2 but we have dropzone@5.9.3 (used by flask_dropzone).
npm 11 (local, Node 24) silently installs without the flag. Adding --legacy-peer-deps
makes CI npm ci use the same lenient peer resolution as local.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…k handler

response_api_error(message, data=None) has no status= parameter in this branch;
the phase4 fix was written against a different version. Remove the invalid kwarg
so the OperationalError handler can return a clean 200-error JSON response and
suppress the Traceback that fails CI's log check.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bootstrap 4→5 migration removed bootstrap-select (selectpicker), which
rendered <select> as <button> elements. The Playwright tests were written
against selectpicker's button/listbox UI; they now use native selectOption()
on the underlying <select> elements.

Also fixes:
- manage_customer_view.html: data-toggle → data-bs-toggle on three collapse
  triggers (BS4 attribute not recognized by BS5 JS)
- dim/tasks.spec.js: .form-group → .has-feedback wrapper (form-group removed
  in BS5; DataTable column filter helper now wraps inputs in .has-feedback)
- dashboard.spec.js: check for .invalid-feedback instead of specific error
  text (propagate_form_api_errors shows inline validation, not toast)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ate duplicate

- assets.spec.js: add { force: true } to selectOption on #asset_type_id
  (Tom Select wraps native <select> with ts-hidden-accessible; Playwright
  visibility check fails without force)
- templates.spec.js: add { force: true } to selectOption on #report_language
  (same Tom Select ts-hidden-accessible issue)
- modal_add_report_template.html: remove duplicate form.report_language render
  (template rendered the field twice causing Playwright strict-mode violation)
- dashboard.spec.js: replace .invalid-feedback DOM check with waitForResponse
  checking HTTP 400 (more reliable than asserting a specific DOM error pattern
  that varies based on which validation path fires)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… E2E dashboard test resilient assertion

Tom Select auto-selects first option sending case_customer_id as a string ("1"), which
fails SQLAlchemy 2.0 + psycopg3 BigInteger comparison.  Coerce to int after assert_type_mml
validates it is numeric.  Also relax E2E assertion from exact status 400 to response.ok()===false
so the test verifies user-visible error behaviour regardless of whether the server returns 400 or 500.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@gru3zi
gru3zi merged commit 76a1abf into feat/phase3-ace-removal Jun 24, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant