From 1f6395382d6f1f1a5f00a3a3d632a654066a3cb6 Mon Sep 17 00:00:00 2001 From: Bryce Date: Tue, 2 Jun 2026 07:55:47 -0700 Subject: [PATCH 1/2] refactor(charts): unify on Chart.js, remove Chartist The admin page was the only consumer of Chartist while the dashboard and expense report already use Chart.js. Convert the admin "Growth in clients" (bar) and "Changes by hour" (line) charts to Chart.js using the same Alpine x-data/x-init canvas pattern as the dashboard, and drop the global Chartist CSS/JS includes from the base page. Co-Authored-By: Claude Opus 4.8 --- src/clj/auto_ap/ssr/admin.clj | 81 ++++++++++++++++++++++++----------- src/clj/auto_ap/ssr/ui.clj | 2 - 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/src/clj/auto_ap/ssr/admin.clj b/src/clj/auto_ap/ssr/admin.clj index 687010ad..334534d9 100644 --- a/src/clj/auto_ap/ssr/admin.clj +++ b/src/clj/auto_ap/ssr/admin.clj @@ -10,8 +10,7 @@ [bidi.bidi :as bidi] [clj-time.coerce :as coerce] [clj-time.core :as time] - [datomic.api :as dc] - [hiccup2.core :as hiccup])) + [datomic.api :as dc])) (defn hourly-changes [] (let [tx-instant-attr (:db/id (dc/pull (dc/db conn) '[:db/id] :db/txInstant)) @@ -56,34 +55,68 @@ [:div [:h1.text-2xl.mb-3.font-bold "Growth in clients"] [:div - [:div {:class "w-full h-64" - :id "client-chart" - :data-chart (hx/json {:labels ["2 years ago" "1 year ago" "today"], - :series [(for [n [2 1 0] - :let [start (time/plus (time/now) (time/years (- n)))]] - (->> (dc/q '[:find (count ?c) - :in $ - :where [?c :client/code]] - (dc/as-of (dc/db conn) (coerce/to-date start))) - first - first))]})}] - [:script {:lang "javascript"} - (hiccup/raw - "new Chartist.Bar('#client-chart', JSON.parse(document.getElementById('client-chart').getAttribute('data-chart')))")]]]]) + [:div.w-full.h-64 + [:canvas.w-full.h-full {:x-data (hx/json {:chart nil + :labels ["2 years ago" "1 year ago" "today"] + :data (for [n [2 1 0] + :let [start (time/plus (time/now) (time/years (- n)))]] + (->> (dc/q '[:find (count ?c) + :in $ + :where [?c :client/code]] + (dc/as-of (dc/db conn) (coerce/to-date start))) + first + first))}) + :x-init "new Chart($el, { + type: 'bar', + data: { + labels: labels, + datasets: [{ + label: 'Clients', + data: data, + borderWidth: 1 + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + y: { + beginAtZero: true + } + } + } + });"}]]]]]) (com/content-card {:class "w-1/2"} [:div {:class "flex flex-col px-4 py-3 space-y-3"} [:div [:h1.text-2xl.mb-3.font-bold "Changes by hour"] [:div - [:div {:class "w-full h-64" - :id "changes" - :data-chart (hx/json {:labels (for [n (range -24 0)] - (format "%d" n)), - :series [(hourly-changes)]})}] - [:script {:lang "javascript"} - (hiccup/raw - "new Chartist.Line('#changes', JSON.parse(document.getElementById('changes').getAttribute('data-chart')))")]]]])]) + [:div.w-full.h-64 + [:canvas.w-full.h-full {:x-data (hx/json {:chart nil + :labels (for [n (range -24 0)] + (format "%d" n)) + :data (hourly-changes)}) + :x-init "new Chart($el, { + type: 'line', + data: { + labels: labels, + datasets: [{ + label: 'Changes', + data: data, + borderWidth: 1 + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + y: { + beginAtZero: true + } + } + } + });"}]]]]])]) "Admin")) (def key->handler diff --git a/src/clj/auto_ap/ssr/ui.clj b/src/clj/auto_ap/ssr/ui.clj index f9525ccc..d98e0fe0 100644 --- a/src/clj/auto_ap/ssr/ui.clj +++ b/src/clj/auto_ap/ssr/ui.clj @@ -23,8 +23,6 @@ [:title (str "Integreat | " page-name)] [:link {:href "/css/font.min.css", :rel "stylesheet"}] [:link {:rel "icon" :type "image/png" :href "/favicon.png"}] - [:link {:rel "stylesheet" :href "//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css"}] - [:script {:src "//cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"}] [:link {:rel "stylesheet", :href "/output.css"}] [:script {:src "https://cdn.plaid.com/link/v2/stable/link-initialize.js"}] [:script {:src "https://cdn.jsdelivr.net/npm/@ryangjchandler/alpine-tooltip@1.x.x/dist/cdn.min.js" :defer true}] -- 2.49.1 From 19186097d557de29ddec39e07783a3f368962718 Mon Sep 17 00:00:00 2001 From: Bryce Date: Tue, 2 Jun 2026 09:16:16 -0700 Subject: [PATCH 2/2] fix(ssr): stop content-card forcing always-on scrollbars; add tmp/ scratch dir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit content-card used `overflow-scroll`, which renders scrollbar tracks even when the content fits — visible as superfluous bars around the admin chart cards. Switch to `overflow-auto` so scrollbars only appear when content genuinely overflows (e.g. wide data tables still scroll). Also add a gitignored ./tmp/ scratch directory (tracked via .gitkeep) and document in AGENTS.md that temp files belong there. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 3 +++ AGENTS.md | 4 ++++ src/clj/auto_ap/ssr/components/card.clj | 2 +- tmp/.gitkeep | 0 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 tmp/.gitkeep diff --git a/.gitignore b/.gitignore index 5c1c9908..0378b640 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,6 @@ sysco-poller/**/*.csv .tmp/** playwright-report/** test-results/** +# Scratch dir for temp files (screenshots, logs, etc.); keep the dir, ignore contents +/tmp/* +!/tmp/.gitkeep diff --git a/AGENTS.md b/AGENTS.md index 1efab03e..9bb4fcbb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,9 @@ # Integreat Development Guide +## Temporary Files + +Write any temporary files (screenshots, scratch logs, generated artifacts, etc.) to the `./tmp/` directory at the repo root. Its contents are gitignored (only `.gitkeep` is tracked), so nothing there will be accidentally committed. Do not scatter temp files elsewhere in the repo or in the system `/tmp`. + ## Build & Run Commands ### Build diff --git a/src/clj/auto_ap/ssr/components/card.clj b/src/clj/auto_ap/ssr/components/card.clj index f13242ad..8224d781 100644 --- a/src/clj/auto_ap/ssr/components/card.clj +++ b/src/clj/auto_ap/ssr/components/card.clj @@ -14,5 +14,5 @@ [:section (merge params {:class (hh/add-class " py-3 sm:py-5" (:class params))}) [:div {:class (:max-w params "max-w-screen-2xl")} (into - [:div {:class "relative overflow-scroll shadow-md dark:bg-gray-800 sm:rounded-lg border-2 border-gray-200 dark:border-gray-900 bg-white"}] + [:div {:class "relative overflow-auto shadow-md dark:bg-gray-800 sm:rounded-lg border-2 border-gray-200 dark:border-gray-900 bg-white"}] children)]]) diff --git a/tmp/.gitkeep b/tmp/.gitkeep new file mode 100644 index 00000000..e69de29b -- 2.49.1