Skip to content

feat: migrate to Vue 3 (rebase vue3 onto master and fix rendering) - #1012

Draft
0xbrayo wants to merge 9 commits into
ActivityWatch:masterfrom
0xbrayo:fix/vue3-rebase
Draft

0xbrayo wants to merge 9 commits into
ActivityWatch:masterfrom
0xbrayo:fix/vue3-rebase

Conversation

@0xbrayo

@0xbrayo 0xbrayo commented Sep 29, 2026

Copy link
Copy Markdown
Member

Follow-up to #772 / #773: the vue3 integration branch rebased onto current master, plus the fixes needed for the UI to actually render. Stays on bootstrap-vue-next — no UI library change.

Commits

  1. Bob's vue3 commits, rebased — feat(build): migrate to Vue 3 + bootstrap-vue-next #773, fix(vue3): remove dead vue-awesome imports #831, fix(vue3): replace datetime component with native datetime-local input in EventEditor #839. feat(categories): support field-scoped regex rules #840 is dropped since master already has it as feat(categories): support field-scoped regex rules on master #952. The conflicts were mostly master's newer templates (i18n, redesigns); those keep master's markup, with feat(build): migrate to Vue 3 + bootstrap-vue-next #773's mechanical Vue 3 changes (filters, BS5 utility classes, update:modelValue, lifecycle hooks) re-applied across the tree.
  2. fix(vue3): finish migration after rebasing onto master — brings code added to master since the branch was cut up to Vue 3: vue-i18n 8 → 11, component tests ported to Vue Test Utils 2, and a toRaw() fix in the activity store (Pinia returns reactive proxies, so the query_options identity checks never matched and a failed query left the progress bar stuck). It also replaces the stubbed vue-d3-sunburst (Vue 2 only) with a small D3 sunburst, so the Vue 2 stub plugin is gone from vite.config.js.
  3. fix(vue3): make the bootstrap-vue-next UI render — the issues reported in Attempt at Vue 3 migration #772:
    • Component registration: createBootstrap() doesn't register components, so every b-* tag was unresolved. All components and directives are now registered globally, like Vue.use(BootstrapVue) did.
    • bootstrap-vue-next API changes:
      • Alerts use v-model instead of show (they were all hidden) and emit close instead of dismissed.
      • Form controls take model-value instead of value/checked.
      • Dropdowns align with end; modals use no-footer.
      • BTable sort-by takes [{ key, order }].
      • Bootstrap 5 drops the input-group append/prepend wrappers and .close.
    • Vue 2 modal/toast APIs: $bvModal, $bvToast, v-b-modal and $root bv:: events are replaced with v-model state and useToastController(). The event editor now takes v-model:open.
    • /activity/:host "page not found": the relative redirect: 'view/' doesn't resolve in vue-router 4, and absent optional params arrive as '' and override the prop defaults.
    • Vue 3 regressions:
      • vuedraggable 4 needs an #item slot (the dashboard rendered nothing).
      • () => import() async components rendered [object Promise] and now use defineAsyncComponent.
      • v-if + v-for on one element in the category tree ignored expansion.
      • The async error mixin crashed on errorCaptured.
    • Also: the timeline bar chart's aspect ratio, missing Font Awesome icons, Bootstrap 4's link style and the activity view tabs under Bootstrap 5.
    • Vite 7: master pins esbuild 0.28 in overrides, which Vite 6's dev server can't pre-bundle dependencies with.

Testing

  • npm run build and npm test pass (478 tests; new regression tests for the activity route redirect, the sunburst and the dashboard's draggable keying).
  • Loaded every route (home, activity views, timeline, stopwatch, buckets and the bucket view, every settings section, query, search, trends, work report, billing, AI summary, alerts, report, graph) in Chrome against a live aw-server-rust v0.13.1, with no console errors apart from the GitHub release check being rate-limited. Opened the navbar dropdowns and the category edit dialog. I didn't click through every control or save edits.

Known gaps

  • Most of the checking was in the light theme. static/dark.css was written against Bootstrap 4 class names and needs a pass under Bootstrap 5.
  • bootstrap-vue-next is still pinned at ^0.25 (latest is 1.2); upgrading is left for a separate PR.
  • The Trends "Time per day" chart labels its x-axis with hours for multi-day ranges. That's also the case on master, because the chart isn't passed the period length.

TimeToBuildBob and others added 5 commits September 29, 2026 14:22
* feat(build): migrate build system to Vue 3 + bootstrap-vue-next

Phase 1 of Vue 3 migration (aw-webui#772):
- vue 2.7 -> 3.5, vue-router 3 -> 4
- bootstrap-vue -> bootstrap-vue-next (bootstrap 4 -> 5)
- chart.js 3 -> 4 (required by vue-chartjs v5)
- @vitejs/plugin-vue2 -> @vitejs/plugin-vue
- Remove webpack/@vue/cli-* packages entirely
- Remove Vue 2-only packages: vue-datetime, vue-color, vue-awesome, vuedraggable v2
- Add vuedraggable v4, @fullcalendar/vue3 v6
- Update main.js: createApp() + createBootstrap() (bootstrap-vue-next API)
- Update route.js: createRouter() + createWebHashHistory() (Vue Router 4 API)
- Update stores/index.js: remove PiniaVuePlugin (Vue 2 only)
- Update filters.js: export functions instead of Vue.filter() (removed in Vue 3)
- Fix Vue.extend() -> defineComponent() in 3 components
- Fix Calendar.vue: @fullcalendar/vue -> @fullcalendar/vue3
- Fix TimelineBarChart.vue: vue-chartjs/legacy -> vue-chartjs (v5 API)
- Add vite.config.js stub plugin for Vue 2-only packages
- Disable transformAssetUrls to allow runtime-served assets (logo.png)
- Add IconPlaceholder.vue stub for vue-awesome icon component
- Fix Header/Footer component names (reserved in Vue 3 ESLint rules)

Build: 2191 modules transformed, dist generated successfully.
Components still use Vue 2 Options API - individual migration in follow-up commits.

* fix(deps): upgrade eslint-config-typescript to v11 for Vue 3 compatibility

@vue/eslint-config-typescript ^10 requires eslint-plugin-vue ^8, which
conflicts with ^9 (needed for Vue 3). Upgrading to ^11 resolves the
ERESOLVE peer dependency conflict that was breaking npm ci in CI.

* fix(ci): fix ESLint and Jest config for Vue 3 migration

- Bump ESLint ecmaVersion from 2017 to 2020 (supports dynamic import())
- Remove broken regex-style override patterns (ESLint uses globs, not regex)
- Remove recursive vue-eslint-parser override that caused stack overflow
- Replace @vue/cli-plugin-babel/preset with @babel/preset-env in babel config
- Remove @vue/cli-plugin-unit-jest preset from Jest config (package removed)
- Replace @vue/vue2-jest with @vue/vue3-jest for .vue file transforms
- Add testEnvironmentOptions to fix @vue/test-utils browser build resolution
- Add @vue/vue3-jest to devDependencies

* fix(e2e): bind Vite dev server to 127.0.0.1 for e2e tests

The e2e tests connect to http://127.0.0.1:27180 but Vite defaults to
binding on 'localhost' which may resolve to ::1 (IPv6) on Ubuntu 24.04
CI runners, causing ConnectionRefused errors.

* fix(vue3): migrate v-model events, lifecycle hooks, and filter syntax

Vue 3 breaking changes that were missed in the initial migration:

- $emit('input') → $emit('update:modelValue') in all custom components
  that support v-model (InputTimeInterval, QueryOptions, SelectCategories,
  SelectCategoriesOrPattern, ColorPicker). This was causing Timeline view
  to be stuck on "Loading..." because daterange was never emitted.

- beforeDestroy → beforeUnmount lifecycle hook (InputTimeInterval,
  Activity, CategorizationSettings). Vue 3 renamed this hook.

- {{ value | filterName }} pipe syntax → {{ filterName(value) }} function
  calls across all 14 affected components. Vue 3 removed global filters;
  functions are imported from ~/util/filters and exposed via methods.

* fix(vue3): address Greptile review findings

- Header.vue: fix Vue 2 slot syntax (slot= → #) on Activity and Tools
  dropdown buttons — broken in Vue 3, caused empty navbar dropdowns
- vite.config.js: give setCsp/autoInject unique plugin names ('set-csp'
  and 'auto-inject') instead of duplicate 'html-transform'
- package.json: move vue-router from devDependencies to dependencies
  (it's a runtime import, not a build tool)

* fix(vue3): set $aw global property before app.mount()

In Vue 3, app.config.globalProperties must be set before mounting.
Move $aw alongside the other global properties (PRODUCTION, COMMIT_HASH,
$isAndroid) before the mount() call. configureClient() stays after mount
since it depends on the settings store being initialized.

* fix(vue3): Font Awesome icons, Bootstrap 5 classes, Vue 3 patterns

Major visual fixes for the Vue 3 migration:

- Replace empty IconPlaceholder with @fortawesome/vue-fontawesome — maps all
  50+ vue-awesome icon names to Font Awesome 6 equivalents, fixing missing
  icons throughout the app (navbar, footer, buckets, settings, etc.)
- Migrate Bootstrap 4 → 5 utility classes across all 30+ Vue files:
  .ml-* → .ms-*, .mr-* → .me-*, .pl-* → .ps-*, .pr-* → .pe-*,
  .float-left → .float-start, .float-right → .float-end,
  .text-left → .text-start, .text-right → .text-end
- Fix Buckets.vue: replace Vue 2 $root.$emit modal control with
  bootstrap-vue-next v-model pattern
- Fix Home.vue: add null guard for serverStore.info access that
  crashed render before server info loaded
- Fix Buckets.vue: add null guard for serverStore.info.hostname
- Update vite.config.js: add comment explaining why transformAssetUrls:
  false is needed (runtime /logo.png from aw-server, not a build asset)

Co-authored-by: Bob <bob@superuserlabs.org>
* fix(vue3): remove dead vue-awesome imports

* fix(vue3): update color picker model binding

* fix(vue3): align ColorPicker v-model prop

* fix(vue3): resync ColorPicker on prop updates
…t in EventEditor (ActivityWatch#839)

* fix(vue3): replace datetime component with native datetime-local input in EventEditor

* fix(vue3): restore seconds precision in EventEditor datetime inputs

Add step='1' to datetime-local inputs and use HH:mm:ss format strings
to prevent silent truncation of seconds when editing event timestamps.
Without this, any edit rounded timestamps to the nearest minute and
corrupted duration arithmetic by up to 59 seconds.

---------

Co-authored-by: TimeToBuildBob <223556219+Copilot@users.noreply.github.com>
Master gained a lot since the Vue 3 branch was cut (i18n, new views and
tests), so bring those parts up to Vue 3 as well:

- Replace vue-d3-sunburst (Vue 2 only, stubbed out so far) with a small
  D3-backed zoomable sunburst, and drop the Vue 2 stub plugin from the
  Vite config since nothing imports the stubbed packages any more.
- Compare query options with toRaw() in the activity store: Pinia state
  reads return reactive proxies, so the identity checks never matched and
  a failed query left the progress bar stuck.
- Port master's component tests to Vue Test Utils 2 (global mocks/stubs,
  props, unmount), vue-router 4's resolve() and vue-i18n's global locale.
- Compile pug in Jest with the html doctype, like @vitejs/plugin-vue, so
  shorthand slots such as `template(#header)` parse.
- Rename the Header/Footer components (reserved HTML names) and let
  ESLint parse ES2021 numeric separators.
After the Vue 3 migration the app built and tests passed, but most of the
UI didn't render when run against a server:

- bootstrap-vue-next components were never registered (createBootstrap()
  only installs its plugins), so every `b-*` tag was an unknown element.
  Register all components and directives globally, as Vue.use(BootstrapVue)
  did, and use the canonical names instead of bootstrap-vue's aliases
  (b-btn, b-input, b-select, b-checkbox).
- Port templates to bootstrap-vue-next's API: alerts are shown with
  v-model instead of `show` (they were all hidden) and emit `close`
  instead of `dismissed`; form controls bind `model-value` instead of
  `value`/`checked`; dropdowns align with `end`; modals use `no-footer`;
  table sorting takes `[{ key, order }]`; Bootstrap 5 dropped the
  input-group append/prepend wrappers and `.close`.
- Replace the Vue 2 modal/toast APIs ($bvModal, $bvToast, v-b-modal and
  $root `bv::` events) with v-model state and useToastController(); the
  event editor now takes `v-model:open`.
- /activity/:host showed "page not found": vue-router 4 doesn't resolve
  the relative `redirect: 'view/'`, and absent optional params are passed
  as '' and overrode the prop defaults.
- The activity dashboard used vuedraggable 2's API (v4 needs an #item
  slot and item-key), so it rendered no visualizations.
- Async components declared as `() => import()` rendered "[object
  Promise]"; use defineAsyncComponent.
- v-for and v-if on the same element in the category tree: v-if now wins,
  so expansion was ignored.
- The async error mixin crashed on Vue 3's single errorCaptured hook and
  re-wrapped the component's shared methods on every new instance.
- The timeline bar chart's responsive options were on its data object,
  so it kept an aspect ratio; give it a fixed-height container.
- Add Font Awesome icons for names that were missing from the map.
- Keep Bootstrap 4's link style (underline on hover only), and fix the
  activity view tabs and header spacing under Bootstrap 5.
- Upgrade to Vite 7, which supports the esbuild version master pins, and
  replace every CSP placeholder in index.html in dev.
@codecov

codecov Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 19.32773% with 96 lines in your changes missing coverage. Please review.
✅ Project coverage is 62.98%. Comparing base (56e8de7) to head (5759265).

Files with missing lines Patch % Lines
src/main.js 0.00% 68 Missing ⚠️
src/mixins/asyncErrorCaptured.js 0.00% 8 Missing and 3 partials ⚠️
src/plugins/bootstrap.ts 0.00% 7 Missing and 1 partial ⚠️
src/util/filters.js 16.66% 5 Missing ⚠️
src/route.js 50.00% 2 Missing ⚠️
src/stores/activity.ts 85.71% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1012      +/-   ##
==========================================
- Coverage   63.30%   62.98%   -0.32%     
==========================================
  Files          52       53       +1     
  Lines        3608     3658      +50     
  Branches      840      898      +58     
==========================================
+ Hits         2284     2304      +20     
+ Misses       1309     1271      -38     
- Partials       15       83      +68     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[High risk] Migrates entire frontend framework from Vue 2 to Vue 3.

The PR appears safe to merge based on this review.

Summary

The PR migrates the web UI to Vue 3 and updates its rendering, routing, controls, and visualizations. Since the previous review, it marks unfetched activity-history periods so the period-usage chart does not present them as completed data.

Reviews (5) · Last reviewed commit: "fix(activity): keep period usage loading..."

Comment thread src/views/activity/Activity.vue Outdated
Comment thread src/views/settings/DaystartSettings.vue Outdated
Comment thread src/views/activity/ActivityView.vue Outdated
Comment thread src/visualizations/SunburstCategories.vue Outdated
Comment thread src/visualizations/SunburstCategories.vue Outdated

@TimeToBuildBob TimeToBuildBob left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the #772 list and a live checkout of cc81fb5.

The slice is right: rebase vue3 onto current master, stay on bootstrap-vue-next, and make the UI actually render. The route redirect, paramsAsProps, vuedraggable #item slot, defineAsyncComponent, CategoryTree v-for/v-if split, chart :data/:options, and dropping $bvModal/$bvToast all look correct. Unit tests (478) plus e2e on aw-server / aw-server-rust v0.12.3b18 are green.

Not merge-ready yet. Three concrete breakages, plus one CI regression vs master:

  1. Filters cannot open. Activity still uses Vue 2 :pressed.sync. In Vue 3 that does not write back, so showOptions never becomes true.
  2. Settings / Trends @change still assume bootstrap-vue's value payload. startOfDay, locale, landing page, default duration, and the Trends host selector assign $event. bootstrap-vue-next emits the native event there; startOfWeek already uses v-model and is the pattern to copy.
  3. New sunburst hover/zoom identity. root is markRaw, but assigning a descendant to reactive hovered/zoomed proxies it. isHighlighted uses ancestors().includes(d) and zoomTo uses d === this.zoomed, so hover dims the hovered arc and clicking the center cannot zoom out.
  4. e2e vs aw-server-rust master is a new failure. Same matrix cell is green on Vue 2 master. Here: Home passes, Activity stays on .aw-loading / "Loading...", TestCafe refreshes twice, then Chrome disconnects (6/8 failed). The v0.12.3b18 jobs passing is not enough — this cell is part of the required matrix.

Lower priority, not merge-blocking on their own:

  • Dashboard visKey is view.id + '-' + indexOf(el), so keys move with position during drag. Visualizations are already index-addressed (el_id), but a stable key (or an id on each element) would avoid remounts.
  • Dark theme / dark.css under Bootstrap 5, and the 0.25 → 1.x bump, can stay follow-ups as you listed.
  • jquery is still in package.json with no remaining source import. Fine to drop later.

Please keep shadcn-vue out of this PR. Once the four items above are fixed, this is the right vehicle to get Vue 3 onto master.

Comment thread src/views/activity/Activity.vue Outdated
Comment thread src/views/settings/DaystartSettings.vue Outdated
Comment thread src/visualizations/SunburstCategories.vue
@ErikBjare

Copy link
Copy Markdown
Member

@TimeToBuildBob Might be worth checking this against https://bootstrap-vue-next.github.io/bootstrap-vue-next/docs.html and https://bootstrap-vue-next.github.io/bootstrap-vue-next/docs/migration-data/

Also wondering if this should really target master, or if it should simply be force-pushed to the vue3 branch or create a vue3-phase2 branch or similar, where we can apply final changes before merging to master. Not sure if that makes sense with how this was put together, but otherwise I think this PR will sit/become stale (that could be okay) until we fix ~every issue. (should probably wait until after v0.14.0 stable and any patch releases are done)

@TimeToBuildBob

Copy link
Copy Markdown
Contributor

Good questions. My read:

1. migration-data — yes, use it as the checklist. It's now a machine-readable KB (/docs/migration-data): a sync-modifier pattern, component-aliases, show-hide, v-html-props, plus per-component pages. I ran the high-risk entries against the PR tree:

  • No leftover BootstrapVue-v2 component aliases (b-btn, b-dd-*, b-checkbox, …) — plugins/bootstrap.ts registers the B* set, and Vue resolves kebab-case to it.
  • No $bvModal / $bvToast / v-b-modal left.
  • No -html props on BVN components; the modal uses :model-value + no-footer (correct for BVN).
  • The one real miss is the .sync I flagged: Activity.vue:149 :pressed.sync="showOptions" → needs v-model:pressed. That's the Filters panel not opening (also Greptile's P1).

The sync-modifier class is exactly what got missed by eyeballing, so a systematic pass over the KB is worth it.

2. Branch target — don't target master. master is the Vue 2 shipping line and must stay patchable through v0.14.0 stable and its patch releases; an 11k/19k-line migration there freezes both. Since you're fine letting it sit until ~every issue is fixed, the migration belongs on a dedicated branch and lands as one release-gated vue3 → master merge afterwards.

The existing vue3 branch is the right home but is stale (132 behind / 4 ahead of master, last push 2026-05-23); this PR is its rebased successor. My preference is to reuse vue3 rather than add a third branch — tag the old tip (vue3-pre-rebase-2026-05-23) so nothing is lost, then make the rebased tree the branch head. vue3-phase2 is only worth it if you specifically want vue3 frozen as the historical attempt; otherwise it's one more thing to maintain.

Mechanics — there's a trap worth naming first: if vue3 is simply updated to this PR's head, the PR goes empty and GitHub auto-closes it. Two clean shapes:

  • Set vue3 to eace5bf1d (the master-rebased migration, before the render fix), then retarget this PR's base master → vue3. The PR then shows just cc81fb5bc (the render fix) as its diff, and merges into vue3; parity work continues as further PRs against vue3.
  • Or set vue3 to cc81fb5bc (full PR head) and close this PR as superseded, with parity PRs against vue3 from then on. Simpler, but drops this PR's thread/CI as the vehicle.

I have no write access on ActivityWatch/aw-webui, so creating/updating the branch and retargeting are maintainer actions (or 0xbrayo, if they have write access). Tell me which shape you want and I'll write up the exact commands for whoever executes it.

3. Wait until after v0.14.0 stable + patches — agree. Gate: v0.14.0 stable tagged, patch releases done, then the vue3 → master merge. No master pressure before that.

Status on the PR: my CHANGES_REQUESTED review stands (Filters-panel .sync, the calendar @change storing a native Event, and the sunburst markRaw-vs-proxied d3 node). Unit tests are 478/478 green; the single red check is a testcafe e2e browser-disconnect (Chrome disconnected) — infra flake, not a code failure. I lack admin rights to rerun that job.

…urst

- bootstrap-vue-next form controls emit update:modelValue, not change, so
  `@change` handlers received the native Event: settings stored the event
  as their value and the Trends host picker navigated to it. Bind with
  v-model (lazy for the start-of-day time input) or update:model-value.
- The activity filters toggle used Vue 2's `:pressed.sync`, so the panel
  could not be opened; use v-model:pressed.
- Key dashboard visualizations by a stable per-element id instead of their
  position, so reordering doesn't hand one visualization's instance (and
  local state) to another.
- Mark every sunburst node raw, not just the root: hovered/zoomed nodes
  went through reactive state and no longer matched the raw nodes, so the
  hovered arc was dimmed and the zoomed arc couldn't zoom back out.
- Pick the sunburst center color from the applied theme setting; this
  branch loads dark.css without a `.dark` class.
@0xbrayo

0xbrayo commented Sep 29, 2026

Copy link
Copy Markdown
Member Author

@greptile review

Comment thread src/views/settings/DaystartSettings.vue Outdated
bootstrap-vue-next reads lazy from the v-model modifiers, not a prop, so
the bare `lazy` attribute saved (and reloaded settings) on every input.
@0xbrayo

0xbrayo commented Sep 29, 2026

Copy link
Copy Markdown
Member Author

@greptile review

@0xbrayo
0xbrayo marked this pull request as draft September 29, 2026 15:17
@TimeToBuildBob

Copy link
Copy Markdown
Contributor

Follow-up after 5cc51e6 / 6f00379 — I re-ran the bootstrap-vue-next migration-data pass on the new head.

The earlier miss is gone: Filters is v-model:pressed, and settings/Trends use v-model / v-model.lazy / @update:model-value. That matches the BFormInput entry (lazy is a Vue modifier, not a BVN prop). Still no leftover aliases, $bvModal/$bvToast/v-b-modal, *-html props, or hide-footer. Alerts are :model-value + @close. Remaining @change handlers are on native inputs.

Review items 1–3 are verified in the tree. The aw-server-rust master e2e cell is still running on this head.

Branch-target rec is unchanged: keep this off master until v0.14.0 stable + patches (v0.14.0b8 is still the latest); reuse vue3 rather than adding vue3-phase2. Still needs a maintainer to move the branch — I have no write access.

The e2e tests stalled for minutes per view and the aw-server-rust master
job failed with the browser disconnecting. Two causes, both reproducible
locally with a fresh Vite cache:

- Vite only scanned index.html for dependencies, so it discovered those
  of each lazily loaded route on first visit, re-optimized and force-
  reloaded the page (answering in-flight imports with 504 "Outdated
  Optimize Dep"). Scan all source files at startup instead.
- The period usage chart and the simple timeline are async components
  that only drew when their data prop changed after mounting. When the
  data loaded first (as with slower chunk loading), they stayed on
  "Loading..." forever. Draw data that is already there on mount.
@0xbrayo

0xbrayo commented Sep 29, 2026

Copy link
Copy Markdown
Member Author

@greptile review

Comment thread src/visualizations/PeriodUsage.vue Outdated
getActiveHistoryAroundTimeperiod fills unfetched periods with zero-
duration placeholders, so drawing whatever data was there on mount could
show an all-empty, clickable chart while the history query was still
running. Mark the placeholders and only draw on mount once at least one
period has actually been fetched.
@0xbrayo

0xbrayo commented Sep 29, 2026

Copy link
Copy Markdown
Member Author

@greptile review

@0xbrayo

0xbrayo commented Sep 29, 2026

Copy link
Copy Markdown
Member Author

🤖 Claude, on behalf of @0xbrayo

@TimeToBuildBob all four items from your review are addressed, and CI is fully green on 5759265, including the aw-server-rust master e2e cell:

  1. Filters — v-model:pressed (5cc51e6).

  2. @change payloads — v-model / v-model.lazy / @update:model-value (5cc51e6, 6f00379).

  3. Sunburst identity — every d3 node is markRaw, with a regression test (5cc51e6). The dashboard also uses a stable per-element key now.

  4. e2e vs aw-server-rust master — not a flake. I reproduced it locally with a cold Vite cache against a locally built aw-server-rust master (c154537). There were two causes:

    • Vite only scanned index.html for dependencies. So on the first visit to each lazily loaded route it re-optimized and force-reloaded the page, answering in-flight imports with 504 Outdated Optimize Dep. That cost ~2 min per view in every matrix cell (the v0.12.3b18 jobs were passing slowly); the rust-master cell just crossed TestCafe's browser-disconnect threshold. optimizeDeps.entries now covers all sources.
    • The period-usage chart and simple timeline only drew when their data prop changed after mounting. With slower chunk loading the data arrived first and they stayed on "Loading..." forever. They now draw on mount, but only once the history is actually fetched rather than placeholders (5759265, per Greptile).

    The e2e jobs dropped from 8–10 min to ~2.5 min, and the e2e suite itself from ~6–8 min to ~25 s.

Greptile is at 5/5 with no open threads. Could you re-review when you have a chance? On the branch target, I'll leave that to @ErikBjare.

@TimeToBuildBob TimeToBuildBob left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@0xbrayo Re-reviewed 5759265. The four requested changes are in the tree, and CI is fully green — including the aw-server-rust master e2e cell.

  1. Filters: v-model:pressed
  2. Settings/Trends: v-model / v-model.lazy / @update:model-value (remaining @change is native)
  3. Sunburst: every d3 node is markRaw; hover regression test is there
  4. rust-master e2e: Vite optimizeDeps.entries + PeriodUsage hasFetchedHistory

Approving the code. Still draft — don't merge to master until after v0.14.0 stable + patches. Branch target is still Erik's call.

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.

3 participants