Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
60a2ac8
Add verified test coverage, coverage gating in CI, and Codecov upload
roncodes Aug 9, 2026
7285963
Fix eight contained defects found during the coverage work
roncodes Aug 9, 2026
ef4be50
Fix five behavioural defects; two need a product decision
roncodes Aug 9, 2026
50e102d
Merge pull request #144 from fleetbase/fix/group-b-quick-wins
roncodes Aug 18, 2026
67aad3f
Merge pull request #145 from fleetbase/fix/group-c-behavioural
roncodes Aug 18, 2026
e6a3903
Delete confirmed dead code; scope the coverage gate to first-party so…
roncodes Aug 18, 2026
d605af1
Adopt eslint-plugin-qunit and a rule for unguarded handler arguments
roncodes Aug 18, 2026
a1187e0
Rebuild translations-editor around stable rows
roncodes Aug 18, 2026
6be5c26
Replace ember-radio-button with a native implementation
roncodes Aug 18, 2026
97c7b20
Make model-select's infinite scroll actually work
roncodes Aug 18, 2026
8c3521d
Let the resource-identity cell actually compact
roncodes Aug 18, 2026
23f1b18
Stop custom-fields-manager refetching a subject on every tab change
roncodes Aug 19, 2026
9c52199
Batch A part one: cover the reachable small gaps, mark the verified-u…
roncodes Aug 19, 2026
8a838a8
Batch A part two: more small gaps covered, more unreachable ones reco…
roncodes Aug 19, 2026
243c5a3
Batch A part three: sorting cycled off, render-in-place, and a failin…
roncodes Aug 19, 2026
f02557f
Batch A part four: arguments cleared to undefined, and the drop handl…
roncodes Aug 19, 2026
2a10b3d
Batch A part five: the panel's auth schema, a chart torn down mid-loa…
roncodes Aug 19, 2026
f29012a
Batch B part one: modal.js — FastBoot residue, and two arguments the …
roncodes Aug 20, 2026
e797f4b
feat(signature-pad): add signature pad component and custom field type
roncodes Aug 20, 2026
8570a4a
Merge pull request #147 from fleetbase/fix/group-a-dead-code
roncodes Aug 21, 2026
ba7df57
Merge pull request #148 from fleetbase/fix/group-5-tooling
roncodes Aug 21, 2026
66c1d36
Merge pull request #149 from fleetbase/fix/translations-editor
roncodes Aug 21, 2026
2d8b734
Merge pull request #150 from fleetbase/fix/native-radio-button
roncodes Aug 21, 2026
c7ff85e
Merge pull request #151 from fleetbase/fix/model-select-infinity
roncodes Aug 21, 2026
93ff9e2
Merge pull request #152 from fleetbase/fix/resource-identity-padding
roncodes Aug 21, 2026
3370ad2
Merge pull request #153 from fleetbase/fix/custom-fields-tab-reload
roncodes Aug 21, 2026
a7e3e5b
Merge pull request #154 from fleetbase/test/coverage-batch-a
roncodes Aug 21, 2026
28428db
Merge pull request #155 from fleetbase/test/coverage-batch-b
roncodes Aug 21, 2026
3698b20
Add an in-repo defects tracker
roncodes Aug 21, 2026
4ff0f80
chat-tray: close 21 of 24 coverage gaps, record the one that needs a …
roncodes Aug 21, 2026
2afc95f
custom-fields-manager: fully covered — 22 gaps to zero
roncodes Aug 21, 2026
d0781ca
comment-thread/comment and model-select: cover the modes the fixtures…
roncodes Aug 21, 2026
cccaeec
metadata-editor and chat-window: cover the paths that sit past where …
roncodes Aug 21, 2026
43bf35b
Remove a test helper orphaned by dropping its only caller
roncodes Aug 22, 2026
868e1a6
countdown, tab-navigation and table: cover the second state of things…
roncodes Aug 21, 2026
712cc08
table/empty-state and report/find-select: one file needed tests, the …
roncodes Aug 21, 2026
f8e7c55
array-input and docs-panel: lines pass 95%
roncodes Aug 21, 2026
81adda6
table/cell/dropdown and pagination: branches reach 91%
roncodes Aug 21, 2026
828514e
overlay: one test for four guards, and a ninth dead-code item
roncodes Aug 21, 2026
6916402
filters-picker: a rethrow that is reachable in production but not fro…
roncodes Aug 21, 2026
c4933e3
filters-picker: two guards that re-check what get-url-param already g…
roncodes Aug 21, 2026
1740de5
Remove imports orphaned by dropping the rethrow test
roncodes Aug 22, 2026
bf0ad96
country-select and coordinates-input: a test that passed for the oppo…
roncodes Aug 21, 2026
7461162
tip-tap-editor: two of thirteen template callbacks had never been exe…
roncodes Aug 22, 2026
8410e7e
full-calendar: the first dead-code item that costs users something
roncodes Aug 22, 2026
5c1c76a
dropdown-button and tip-tap: a flaky test removed, and how I missed f…
roncodes Aug 22, 2026
69ba733
smart-nav-menu/customizer: the fourth "guard behind a disabled control"
roncodes Aug 22, 2026
1a942e9
The drag-sort "blocker" was never a blocker
roncodes Aug 22, 2026
3dc4ca5
query-builder/conditions to 100%, and the multi-value editor that onl…
roncodes Aug 22, 2026
0278b46
The interact.js "blocker" was never a blocker either: element-rendere…
roncodes Aug 22, 2026
58a88e2
template-builder toolbar to 100%, properties-panel to its residue, an…
roncodes Aug 23, 2026
11da73a
Merge pull request #157 from fleetbase/test/coverage-batch-b2
roncodes Aug 25, 2026
4faa739
Merge pull request #158 from fleetbase/test/coverage-batch-b3
roncodes Aug 25, 2026
dc17712
Merge pull request #159 from fleetbase/test/coverage-batch-b4
roncodes Aug 25, 2026
bf63b82
Merge pull request #160 from fleetbase/test/coverage-batch-b5
roncodes Aug 25, 2026
3bb8c50
DEFECTS: record the full-calendar listener leak that 8410e7e referenc…
roncodes Aug 25, 2026
3b4ea99
Merge pull request #161 from fleetbase/test/coverage-batch-b6
roncodes Aug 25, 2026
cbeccca
full-calendar: actually stop the listener leak (DEFECTS #17)
roncodes Aug 25, 2026
9a94617
Merge pull request #162 from fleetbase/fix/full-calendar-listener-leak
roncodes Aug 25, 2026
068d4ae
DEFECTS: fold PR #143's four comments in before they are retired
roncodes Aug 25, 2026
ba50481
DEFECTS #16: CI already pins Node 22, so the ESM trap is local-only
roncodes Aug 25, 2026
d6681c8
Work through DEFECTS.md: sixteen of seventeen entries
roncodes Aug 25, 2026
00c8f1d
Merge pull request #163 from fleetbase/fix/defects-sweep
roncodes Aug 25, 2026
9ffa321
DEFECTS: kickoff brief for #15, so the next session starts from facts
roncodes Aug 25, 2026
5a6299b
DEFECTS #16: two hypotheses tried, both ruled out, neither committed
roncodes Aug 25, 2026
3aa7a59
DEFECTS #16: measured — the coverage POST never reaches the server
roncodes Aug 25, 2026
3564e48
feat(template-builder): finish the table's query data mode
roncodes Aug 25, 2026
1732f51
fix(template-builder): close the three coverage gaps in query mode
roncodes Aug 25, 2026
55fb23e
Fix coverage collection: post from Testem.afterTests, not QUnit.done …
roncodes Aug 25, 2026
2139944
Merge pull request #165 from fleetbase/fix/defects-sweep
roncodes Aug 25, 2026
8656672
Merge branch 'test/coverage-campaign' into feature/query-table-data-m…
roncodes Aug 25, 2026
c9bc486
Merge pull request #164 from fleetbase/feature/query-table-data-mode-…
roncodes Aug 25, 2026
312c1f7
Raise testem's disconnect timeout, and cut DEFECTS.md down to what is…
roncodes Aug 25, 2026
dc418e6
Merge pull request #166 from fleetbase/fix/testem-disconnect-timeout
roncodes Aug 25, 2026
e1f848d
smart-nav-menu: one pinned-list resolver, not two (DEFECTS #18)
roncodes Aug 25, 2026
1d5cc07
Merge pull request #167 from fleetbase/fix/smart-nav-menu-pinned-dedup
roncodes Aug 25, 2026
e86cbae
template-builder: 60 uncovered sites down to 12 branches
roncodes Aug 25, 2026
c437e0a
attach/popover: stop leaking document listeners (DEFECTS #20)
roncodes Aug 25, 2026
4fa8687
Adopt ember-window-mock across the addon; navigator and smart-nav-men…
roncodes Aug 25, 2026
aa02f83
Coverage batch: sidebar/item urls, modal scrollbar, combo-box toggle;…
roncodes Aug 25, 2026
6eff256
Add the documentation-driven playground registry and control system
roncodes Aug 25, 2026
76834f5
Render the playground from the addon's dummy application
roncodes Aug 25, 2026
10cb159
Cover the playground with QUnit unit and application tests
roncodes Aug 25, 2026
eb81d7f
Build and deploy the playground to GitHub Pages
roncodes Aug 25, 2026
df725ee
Document the playground
roncodes Aug 25, 2026
6e46ce1
Re-apply control state when the page moves to another component
roncodes Aug 25, 2026
d654d40
query-form: cover updateDescription and the stored-query fallbacks
roncodes Aug 25, 2026
6372e99
smart-nav-menu: cover the dropdown viewport clamp
roncodes Aug 25, 2026
24d4e8b
table: cover the removeRows default; ignore the dead sticky-position …
roncodes Aug 25, 2026
7e7a096
chat-window and sidebar: a missing participants list, and six dead in…
roncodes Aug 25, 2026
bbae8e3
comment-thread and query-builder to 100%, and a getter whose work is …
roncodes Aug 25, 2026
37daffb
activity-log to 100%, and a test that was passing for the wrong reason
roncodes Aug 25, 2026
4c78d20
attach/popover to 100%, and an rAF loop that never ends
roncodes Aug 25, 2026
ee95883
sidebar/item and modal to 100%, and an assertion that fires on teardown
roncodes Aug 25, 2026
6fbcc5f
tab-navigation, template-builder and widget-card to 100%
roncodes Aug 25, 2026
48e7b9b
smart-nav-menu to 100%, by stubbing the measurements instead of stagi…
roncodes Aug 25, 2026
e29decf
table, combo-box and widget/report to 100%, and two tests that tested…
roncodes Aug 25, 2026
592f7a1
kanban/card, layout/header, mobile-navbar and sidebar to 100%
roncodes Aug 25, 2026
0e96dc1
filter/select, action-item, table/empty-state and money-input to 100%
roncodes Aug 25, 2026
01efe97
query-builder joins/group-by, dashboard/create, chat-window and the r…
roncodes Aug 25, 2026
d12fc21
sidebar/navigator to 100%, and a search result that cannot be opened
roncodes Aug 25, 2026
80f9892
timeline, pending-attachment, header dropdown item and utils/dom to 100%
roncodes Aug 25, 2026
c668276
array-input, autocomplete-input, fetch-select and notification-tray t…
roncodes Aug 25, 2026
4512e14
model-select, drawer, filters-picker, sort-by and multi-option to 100%
roncodes Aug 25, 2026
5fcb4ae
close out fourteen small files, and delete four fields nothing reads
roncodes Aug 25, 2026
60bd9a1
aside-item-scroller, filter/range, currency-select and friends to 100%
roncodes Aug 25, 2026
8b9b2b6
Supply the two things the playground's host application was missing
roncodes Aug 26, 2026
01be19d
countdown, phone-input, date-time-input and five more to 100%
roncodes Aug 26, 2026
3e52760
services, to-power-select-groups and click-to-reveal to 100%
roncodes Aug 26, 2026
40c5288
registry-yield and basic-dropdown-hover to 100%
roncodes Aug 26, 2026
f0db110
custom-field, dashboard, floating, content-panel and six more to 100%
roncodes Aug 26, 2026
8094338
template-builder canvas/query-form/variable-picker and the last small…
roncodes Aug 26, 2026
bac8be3
the gate passes: 100% statements, branches, functions and lines
roncodes Aug 26, 2026
b72d356
record where the campaign landed in DEFECTS, BLOCKERS and NEED_INFO
roncodes Aug 26, 2026
e0bc8cf
the CI-only failure: a <LinkTo> click that navigated the test page away
roncodes Aug 26, 2026
a210ac1
the two sites that were only covered because the local window had focus
roncodes Aug 26, 2026
e35b732
record what only CI could have taught us
roncodes Aug 26, 2026
ac8e5ca
HANDOFF.md — one document for everything still open
roncodes Aug 28, 2026
84f538f
the popover arrow, implemented: querySelector, arrow({element}), midd…
roncodes Aug 28, 2026
5b431f5
a search result with children is navigable only with a path through @…
roncodes Aug 28, 2026
3de6d78
gate the conditions panel on the columns the query uses, and drop the…
roncodes Aug 28, 2026
0c0f17b
widget/report can change its report, so selectedReports' dead branch …
roncodes Aug 28, 2026
6e5dc46
record Ron's five decisions and what shipped for each
roncodes Aug 28, 2026
840f750
release v0.4.0: bump the version and seed the release notes
roncodes Aug 28, 2026
5664ab8
Merge pull request #143 from fleetbase/test/coverage-campaign
roncodes Aug 28, 2026
4eed736
Merge remote-tracking branch 'origin/dev-v0.4.0' into feature/signatu…
roncodes Aug 28, 2026
df7df8e
bring the signature pad up to the coverage gate
roncodes Aug 28, 2026
fc03d0d
Merge pull request #156 from fleetbase/feature/signature-pad-componen…
roncodes Aug 28, 2026
be30335
drop the campaign worklists from the release
roncodes Aug 28, 2026
acdd5ad
Rebuild the playground UI from the Claude Design spec
roncodes Aug 28, 2026
27ed417
Merge pull request #168 from fleetbase/feature/component-playground
roncodes Aug 28, 2026
2ac831e
Point the README at the documentation site and the playground; retire…
roncodes Aug 28, 2026
c0afa24
Add the Fleetbase mark to the README header
roncodes Aug 28, 2026
9662be6
Write the repository documentation for the people who read it
roncodes Aug 28, 2026
f1eb00a
Remove the stale in-repo component docs
roncodes Aug 28, 2026
18a5bab
Drop the references to the deleted defects log
roncodes Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

# compiled output
/dist/
/playground-dist/

# misc
/coverage/
Expand Down
20 changes: 19 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ module.exports = {
'autoprefixer',
'tailwindcss',
'@tailwindcss/forms',
// Build-time only: required from index.js when COVERAGE=true.
'ember-cli-code-coverage',
],
},
],
Expand All @@ -53,12 +55,15 @@ module.exports = {
'./.eslintrc.js',
'./.prettierrc.js',
'./.stylelintrc.js',
'./.template-lintrc.js',
'./ember-cli-build.js',
'./index.js',
'./testem.js',
'./blueprints/*/index.js',
'./config/**/*.js',
'./scripts/build-playground.js',
'./scripts/check-coverage.js',
'./scripts/check-coverage-test.js',
'./scripts/stamp-coverage-run.js',
'./tests/dummy/config/**/*.js',
],
parserOptions: {
Expand All @@ -70,5 +75,18 @@ module.exports = {
},
extends: ['plugin:n/recommended'],
},
// QUnit test files. `no-hooks-from-ancestor-modules` is the one that matters most here:
// a nested `module('…', function (hooks) { … })` shadows the outer hooks, which QUnit 3
// turns into a hard error. It is easy to reintroduce and the suite stays green when you do.
{
files: ['tests/**/*-test.js'],
plugins: ['qunit'],
extends: ['plugin:qunit/recommended'],
rules: {
// Opinionated and noisy for this suite: most tests assert an obvious, fixed number
// of things, and an expect() count that drifts is worse than none.
'qunit/require-expect': 'off',
},
},
],
};
207 changes: 144 additions & 63 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,114 +2,195 @@ name: Ember CI

on:
push:
branches: [ main ]
# `dev-v*` are the release integration branches (see release.yml, which tags when one merges
# to main). They are listed here so pull requests targeting a release branch run the full
# suite — without them those PRs would get no checks at all.
branches:
- main
- 'dev-v*'
tags:
- 'v*'
pull_request:
branches: [ main ]
branches:
- main
- 'dev-v*'

env:
NODE_VERSION: 22.x

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/') }}

jobs:
build:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm run lint

build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build
run: pnpm run build

- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v2
with:
node-version: ${{ env.NODE_VERSION }}
- name: Build the playground for GitHub Pages
run: pnpm run build:playground

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest
- name: Verify the Pages artifact
run: |
set -euo pipefail

test -f playground-dist/index.html || { echo 'playground-dist/index.html is missing'; exit 1; }
test -f playground-dist/.nojekyll || { echo 'playground-dist/.nojekyll is missing'; exit 1; }
test -d playground-dist/assets || { echo 'playground-dist/assets is missing'; exit 1; }

- name: Install Dependencies
run: pnpm install
# Assets must resolve under the sub-path, or every request 404s on Pages.
grep -q '/ember-ui/assets/' playground-dist/index.html \
|| { echo 'index.html does not reference assets under /ember-ui/'; exit 1; }

- name: Lint
run: pnpm run lint
# Nothing from the test or coverage lifecycle may reach a published artifact.
for unwanted in tests tests.html testem.js coverage; do
if [ -e "playground-dist/$unwanted" ]; then
echo "playground-dist/$unwanted must not be published"
exit 1
fi
done

- name: Build
run: pnpm run build
if find playground-dist -name 'lcov.info' -o -name 'coverage-*.json' | grep -q .; then
echo 'coverage artefacts leaked into the Pages build'
exit 1
fi

test:
needs: build
name: Test with coverage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v2
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest
- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm

- name: Install Dependencies
run: pnpm install
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm run lint
- name: Coverage gate self-test
run: pnpm run coverage:selftest

- name: Test
run: pnpm run test:ember --filter='!Integration'
- name: Run full test suite with coverage
run: pnpm run test:coverage

- name: Enforce 100% coverage gate
run: pnpm run coverage:check

- name: Verify LCOV report exists
run: test -s coverage/lcov.info || (echo 'coverage/lcov.info missing or empty' && exit 1)

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
files: coverage/lcov.info
flags: ember-ui
fail_ci_if_error: true
disable_search: true
token: ${{ secrets.CODECOV_TOKEN }}

npm_publish:
needs: test
name: Publish to npm
needs: [lint, test]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- uses: actions/checkout@v2
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v2
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: latest
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: pnpm install
- name: Build
run: pnpm run build

- name: Build
run: pnpm run build
- name: Set up npm
run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc

- name: Set up npm
run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
- name: Publish
run: npm publish --access public

- name: Publish
run: npm publish --access public

github_publish:
needs: build
name: Publish to GitHub registry
needs: [lint, test]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v2

- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v2
with:
node-version: ${{ env.NODE_VERSION }}
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
version: latest
node-version: ${{ env.NODE_VERSION }}
cache: pnpm

- name: Install Dependencies
run: pnpm install
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build
run: pnpm run build
Expand Down
Loading
Loading