Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
632 commits
Select commit Hold shift + click to select a range
5aaded6
fix(calendar-web): newedit modal fix
rahmanunver Jul 30, 2025
0da822a
fix(calendar-web): editor preview fix
rahmanunver Jul 31, 2025
8eccb4e
fix: structure mode
gjulivan Aug 1, 2025
6778843
fix(deps): update eslint monorepo to ^9.32.0
renovate-bot Aug 4, 2025
607b339
fix(deps): update eslint monorepo to ^9.32.0 (#1674)
r0b1n Aug 4, 2025
e541a3a
fix(deps): update commitlint monorepo to ^19.8.1
renovate-bot Aug 4, 2025
5641e7c
fix(deps): update dependency typescript-eslint to ^8.38.0
renovate-bot Aug 4, 2025
66b60d0
fix(deps): update dependency typescript-eslint to ^8.38.0 (#1673)
r0b1n Aug 4, 2025
603c967
[WC-3041] Don't restore filter settings if disabled in config (#1801)
r0b1n Aug 5, 2025
82abb6d
chore(data-widgets): bump version to 3.1.1
r0b1n Aug 5, 2025
d9f7627
chore(@mendix/data-widgets): update changelog
uicontent Aug 5, 2025
08b0a80
Data Widgets v3.1.1: Update changelog (#1808)
r0b1n Aug 5, 2025
9383afd
fix(deps): update dependency mendix to v10.24.75382
renovate-bot Jul 28, 2025
505e023
chore(deps): update dependency @codemirror/view to ^6.38.1
renovate-bot Aug 6, 2025
6d86b85
feat(file-uploader): limit total number of files and make it dynamic
gjulivan Aug 4, 2025
4020e6a
chore: copy necessary files into widget bundle
gjulivan Aug 5, 2025
41e2989
fix: copy using rollup plugin
gjulivan Aug 5, 2025
8385374
chore: add license text to root folder of module
gjulivan Aug 5, 2025
7deee4b
fix: update lock file
gjulivan Aug 6, 2025
ec1b726
feat: add onChangeFilterInputEvent to combobox for filter input handling
yordan-st Jul 22, 2025
1ca681e
chore: changelog update
yordan-st Jul 22, 2025
af7b193
refactor: cleanup
yordan-st Jul 23, 2025
e0eeecd
feat: add new snapshot images for combobox component tests
yordan-st Jul 23, 2025
c41775d
fix: add defensive error handling to onChangeFilterInputEvent execution
yordan-st Jul 23, 2025
412b6a6
chore: upgrade min version to 10.22
yordan-st Jul 24, 2025
64b991c
chore: remove darwin screenshots
yordan-st Jul 24, 2025
bc26495
fix: change how we pass init sort
iobuhov Jul 18, 2025
82a6aca
chore: merge conflicts
iobuhov Jul 22, 2025
d984017
fix: add optional chaining for type in input change condition
yordan-st Jul 24, 2025
dbca640
fix: code fixing and cleanup
gjulivan Jul 28, 2025
771379b
chore: update combobox version
gjulivan Jul 28, 2025
e915e0e
feat: add debounce interval property to combobox
yordan-st Jul 29, 2025
fc52120
fix: trigger search term updates only for user input
yordan-st Jul 30, 2025
efd9114
fix: clear test cache
yordan-st Jul 30, 2025
e48f2e7
refactor: revert selectedItem changes and prevent filter triggers on …
yordan-st Jul 31, 2025
93c7179
refactor: simplify filter handler setup and improve selector initiali…
yordan-st Aug 1, 2025
ba54b80
chore: remove unnecessary initialization logic
yordan-st Aug 5, 2025
057ed0b
fix: triggers filter input change only on input change type
gjulivan Aug 10, 2025
409d989
feat(events-web): enhance load delay and repeat properties with param…
yordan-st Jul 14, 2025
f6b59c9
feat(events-web): enhance onChange delay properties with parameter ty…
yordan-st Jul 14, 2025
b3d558f
chore(changelog): update changelog with added support for expressions…
yordan-st Jul 14, 2025
00d4b6b
chore(changelog): update version to 1.1.0 in changelog
yordan-st Jul 14, 2025
fe5dc3a
chore(events-web): fix testing errors
yordan-st Jul 14, 2025
47709df
feat(events-web): implement useDelayAndInterval hook for managing del…
yordan-st Jul 15, 2025
62ef5b1
refactor(events-web): rename properties for consistency
yordan-st Jul 15, 2025
57f89e9
chore(changelog): update changelog to provide clearer intruction
yordan-st Jul 15, 2025
aaa2830
refactor(events-web): rename properties for consistency
yordan-st Jul 15, 2025
eb0629f
chore(changelog): fix formatting for Changelog
yordan-st Jul 15, 2025
35c4a47
refactor: delete old helper hook
yordan-st Jul 15, 2025
117c5d9
chore: prepare release events widget
gjulivan Aug 11, 2025
c7ef62e
chore: prepare release adding OSS readme
gjulivan Aug 12, 2025
6f5fc35
chore(@mendix/combobox-web): update changelog
uicontent Aug 12, 2025
265d298
chore(@mendix/app-events-web): update changelog
uicontent Aug 12, 2025
ec825b7
fix: improve extension validation
r0b1n Jul 31, 2025
cc19f1a
chore: update docker container for mx9
r0b1n Aug 14, 2025
720e2f4
chore: improve release script
r0b1n Aug 14, 2025
8f20b88
[Fix] Release docker for mx9 (#1832)
r0b1n Aug 15, 2025
85f24e8
chore: update description
iobuhov Aug 5, 2025
067eaf0
refactor: rename vars
iobuhov Jul 23, 2025
f93550e
feat: switch data grid to new filter system
iobuhov Jul 23, 2025
df4d2d0
feat: add combined filter store
iobuhov Jul 24, 2025
d30eb3a
chore: add reduceMap helper
iobuhov Aug 5, 2025
a91a901
feat: add restoreMap function
iobuhov Aug 5, 2025
3ddafd2
test: add unit tests for reduce/restore array
iobuhov Aug 5, 2025
3073f11
feat: change filters host
iobuhov Aug 6, 2025
aa34a4d
feat: finish "clean" xpath feature
iobuhov Aug 6, 2025
ae2ed44
feat: convert gallery and fix tests
iobuhov Aug 6, 2025
dbe1ef1
chore: remove unused code
iobuhov Aug 6, 2025
3a8bcb8
chore: add changelog record
iobuhov Aug 15, 2025
554d7ef
[WC-3051]: Improve file extension validation in file uploader web wid…
r0b1n Aug 15, 2025
7a7233f
chore: prepare data widget release
gjulivan Aug 15, 2025
ce0fc51
chore(carousel): update carousel dependency
gjulivan Aug 6, 2025
2ab8ca1
fix: failing unit tests after swiper upgrade
samuelreichert Aug 12, 2025
d3525f7
test: update carousel snapshot test
leonardomendix Aug 18, 2025
7c612ae
chore(@mendix/data-widgets): update changelog
uicontent Aug 18, 2025
961320a
docs(web-widgets): add copilot-instructions.md for PR reviews
rahmanunver Aug 15, 2025
8ca161a
docs(web-widgets): add test requirements to the new copilot instructions
leonardomendix Aug 15, 2025
d96ba34
chore(@mendix/file-uploader): update changelog
uicontent Aug 15, 2025
812697d
chore(@mendix/calendar): update changelog
uicontent Aug 12, 2025
766e403
chore(@mendix/carousel-web): update changelog
uicontent Aug 19, 2025
0970aca
feat(datagrid-web): add RefreshIndicator component and styles for loa…
samuelreichert Jul 11, 2025
913e400
feat(datagrid-web): add refresh indicator property to Datagrid2
samuelreichert Jul 14, 2025
01582b8
feat(datagrid-web): add refreshIndicator prop to Datagrid component
samuelreichert Jul 14, 2025
4131e56
feat(datagrid-web): add refreshIndicator prop to Widget and update Gr…
samuelreichert Jul 14, 2025
560ba50
feat(datagrid-web): add refreshIndicator prop to preview function and…
samuelreichert Jul 14, 2025
5898b6b
refactor(datagrid-web): remove unused isLoading prop and related code…
samuelreichert Jul 14, 2025
b2df9b2
chore(datagrid-web): update changelog
samuelreichert Jul 14, 2025
f22b7a7
feat(datagrid-web): replace isLoading with isFirstLoad and update rel…
samuelreichert Jul 21, 2025
e30c1b6
feat(datagrid-web): add show prop to RefreshIndicator and update usag…
samuelreichert Jul 22, 2025
55ab98a
refactor(datagrid-web): simplify RefreshIndicator usage
samuelreichert Jul 23, 2025
c531b14
docs(datagrid-web): clarify description of the refresh indicator feat…
samuelreichert Jul 23, 2025
437db58
feat(datagrid-web): increase refresh indicator animation timing
samuelreichert Jul 31, 2025
5ef396e
feat(datagrid-web): dont show refresh indicator when resfreh timer is…
samuelreichert Jul 31, 2025
a48b7bf
chore(datagrid-web): add disposeBatch to follow standards on controllers
samuelreichert Jul 31, 2025
063b2e2
test(widget-plugin-grid): fix tests to follow more real world scenari…
samuelreichert Jul 31, 2025
712db1e
test(widget-plugin-grid): run controller setup to all test cases
samuelreichert Jul 31, 2025
1516141
feat(widget-plugin-grid): move showRefreshIndicator to DatasourceCont…
samuelreichert Jul 31, 2025
5e490a1
refactor: change flags
iobuhov Aug 4, 2025
f397317
test(widget-plugin-grid): enhance DatasourceController tests for load…
samuelreichert Aug 4, 2025
4b9f978
test: update ProgressCircle tests to use Testing Library and improve …
samuelreichert Aug 4, 2025
102565e
test: update RangeSlider tests to use Testing Library and improve str…
samuelreichert Aug 4, 2025
91a71c9
test: update Rating tests to use Testing Library and improve structure
samuelreichert Aug 4, 2025
f36354b
test: update Slider tests to use Testing Library and remove Enzyme
samuelreichert Aug 4, 2025
22cb7c8
test: refactor Switch tests to use Testing Library and improve structure
samuelreichert Aug 4, 2025
d747e4d
test: update TimelineComponent tests to use Testing Library and impro…
samuelreichert Aug 4, 2025
ee88fe1
test: update TreeNode widget to use react-tesing-library and remove e…
samuelreichert Aug 5, 2025
3143d76
fix: small fixes from PR comments
samuelreichert Aug 12, 2025
1387e11
[WC-2838]: Implement RefreshIndicator component on Datagrid 2 (#1765)
samuelreichert Aug 20, 2025
0cc9041
feat: initial selection controls version
gjulivan Jul 10, 2025
203e21d
feat: initial update
gjulivan Jul 11, 2025
34f9030
feat: update dropzone for custom content
gjulivan Jul 11, 2025
83adffe
chore: updating code for selection controls for cleaner caption
gjulivan Jul 11, 2025
37a0bd3
chore: removing onleave and onenter event
gjulivan Jul 11, 2025
f0bfb49
chore: update preview
gjulivan Jul 14, 2025
bd94f76
chore: rename selection controls to checkbox radio selection
gjulivan Jul 14, 2025
a1cc9df
chore: update lock file
gjulivan Jul 14, 2025
a326733
fix: lint and build
gjulivan Jul 15, 2025
9917429
fix: update test
gjulivan Jul 15, 2025
de256e7
fix: allow group name and fix onclick label
gjulivan Jul 15, 2025
2a67c1f
test(checkbox-radio-selection-web): update e2e test with new naming
rahmanunver Jul 18, 2025
7c955a7
chore: update checkbox radio icon
gjulivan Jul 23, 2025
1da9f78
feat: allow boolean to choose for checkbox type
gjulivan Jul 23, 2025
65689a3
chore: update styling
gjulivan Jul 24, 2025
fac2a68
feat(checkbox-radio-selection-web): add new icons
rahmanunver Aug 5, 2025
8f728cc
feat(checkbox-radio-selection-web): add checkbox for booleans
rahmanunver Aug 5, 2025
e2f35cf
test(checkbox-radio-selection-web): update test
rahmanunver Aug 5, 2025
fb55cf6
test(checkbox-radio-selection-web): fix e2e tests
rahmanunver Aug 6, 2025
c076024
chore: update rollup config and e2e
gjulivan Aug 7, 2025
6880071
feat: no options text
gjulivan Aug 14, 2025
d323b88
feat: no options text readonly style
gjulivan Aug 15, 2025
cf623ce
fix: update based on testing
gjulivan Aug 18, 2025
ed4d7bb
test(checkbox-radio-selection-web): update e2e spec
leonardomendix Aug 19, 2025
7bdd0dc
test(checkbox-radio-selection-web): update e2e screenshots
leonardomendix Aug 19, 2025
7dc02db
chore: prepare for release with OSS readme
rahmanunver Aug 20, 2025
060e651
Test: finish enzyme removal (#1809)
r0b1n Aug 20, 2025
7aca887
chore: unset appNumber
rahmanunver Aug 20, 2025
56a4b98
feat(gallery-web): add refresh indicator property to gallery
samuelreichert Jul 28, 2025
2fde595
feat: move RefreshIndicator to component kit
samuelreichert Aug 6, 2025
ea4934c
feat(datagrid-web): use RefreshIndicator from the component kit
samuelreichert Aug 6, 2025
3fc471a
feat: customize RefreshIndicator to work well on Datagrid and Gallery
samuelreichert Aug 7, 2025
15e1ae0
fix: broken build on Gallery due to new refreshIndicator property
samuelreichert Aug 7, 2025
3e1f6b4
feat(gallery-web): create a DerivedLoaderController for gallery
samuelreichert Aug 8, 2025
b5f444d
feat(gallery-web): add refreshIndicator to gallery component
samuelreichert Aug 8, 2025
573ef49
feat(gallery-web): implement loader controller on gallery store
samuelreichert Aug 8, 2025
935c9c6
feat(gallery-web): fix derivedLoader to correctly update isRefreshing
samuelreichert Aug 11, 2025
e2fbe90
fix: option text title and ellipsis overflow
r0b1n Aug 11, 2025
66e734b
fix: hide empty option on multi-select as well
r0b1n Aug 12, 2025
b032b81
tmp: fix e2e
r0b1n Aug 11, 2025
80ca67f
fix: prevent text wrap to avoid side effects
r0b1n Aug 20, 2025
4199d7f
[WC-3059] Dropdown filter: title for tooltips and ellipsis overflow (…
r0b1n Aug 21, 2025
fd24249
chore(gallery-web): change refresh indicator property to general group
samuelreichert Aug 21, 2025
2df8f8e
chore(gallery-web): update changelog
samuelreichert Aug 21, 2025
7914682
chore(gallery-web): bump version
samuelreichert Aug 21, 2025
5e75986
chore: update eslint plugins
r0b1n Aug 21, 2025
247a36d
chore: update eslint plugins (#1851)
r0b1n Aug 22, 2025
fdc59c0
[WC-3035]: Gallery refresh indicator (#1816)
r0b1n Aug 22, 2025
0fa1b16
feat(chekbox-radio-selection-web): rename emptyOptionText to noOption…
rahmanunver Aug 22, 2025
69bf1c1
chore(@mendix/checkbox-radio-selection-web): update changelog
uicontent Aug 25, 2025
c9dbd1e
feat: add selection counter
iobuhov Aug 13, 2025
b6451e4
test: cleanup and update
iobuhov Aug 13, 2025
710a890
chore: switch to if component
iobuhov Aug 18, 2025
65df32e
feat: add keep selection logic
iobuhov Aug 21, 2025
e96a4d9
chore: fix the selection status, select none and select all
iobuhov Aug 21, 2025
0f26ae3
feat: add "clear selection" button
iobuhov Aug 22, 2025
5f35921
feat: change selection strategy for gallery
iobuhov Aug 22, 2025
b51e5a8
feat: move selection store to shared package
iobuhov Aug 22, 2025
2332103
feat: add selection to gallery
iobuhov Aug 25, 2025
941ef1e
feat: update gallery xml
iobuhov Aug 25, 2025
918e456
feat: change wording and add switch
iobuhov Aug 25, 2025
95acbb3
feat: update data grid settings
iobuhov Aug 25, 2025
fb566dc
test: update tests
iobuhov Aug 26, 2025
ee08131
test(datagrid-web): update e2e screenshot baseline
leonardomendix Aug 27, 2025
29a2494
test(gallery-web): update e2e screenshot baseline
leonardomendix Aug 27, 2025
277244c
chore: rename props
iobuhov Aug 28, 2025
fdb62c9
chore: bump versions
iobuhov Aug 28, 2025
12a26ca
chore(data-widgets): bump version to 3.3.0
r0b1n Aug 28, 2025
1209b90
chore(@mendix/data-widgets): update changelog
uicontent Aug 28, 2025
9bfe585
Data Widgets v3.3.0: Update changelog (#1861)
r0b1n Aug 28, 2025
41e2ecd
chore: add oss clearance readme file copy step
r0b1n Aug 26, 2025
d6aada2
chore: add oss readme copying to the module mpk
r0b1n Aug 28, 2025
8a7f585
chore: update pnpm
r0b1n Aug 28, 2025
e31ebd9
chore: eslint import sort order
r0b1n Aug 28, 2025
e1a72b8
Various improvements (#1859)
r0b1n Aug 29, 2025
251f234
feat: enhance image properties with min/max height and new units
yordan-st Aug 12, 2025
79e8b4e
feat: enhance image properties with min/max height and new units
yordan-st Aug 12, 2025
2785bf0
fix: apply height to mx-image-viewer
yordan-st Aug 15, 2025
8220103
Add comprehensive AGENTS.md file for AI development assistants
Copilot Aug 29, 2025
820b907
test: fix data widgets e2e screenshots
leonardomendix Sep 1, 2025
6f8d550
Update data widgets filters e2e screenshots (#1871)
leonardomendix Sep 1, 2025
ae81d45
chore: update eslint
r0b1n Sep 2, 2025
6c9a195
chore: update eslint (#1873)
r0b1n Sep 2, 2025
52ddea2
feat(image-web): Bump version to 1.5.0 and add changelog for enhanced…
Copilot Aug 29, 2025
9353a80
fix(image-web): Move changes back to unreleased section per review fe…
Copilot Aug 29, 2025
1e693bf
fix(image-web): Merge changelog entries into single comprehensive entry
Copilot Aug 29, 2025
11171ee
fix(image-web): Restore version 1.5.0 for GitHub action compatibility
Copilot Aug 29, 2025
29f6e4d
chore(@mendix/image-web): update changelog
uicontent Aug 29, 2025
78afa6b
fix: update image-web rollup
gjulivan Sep 2, 2025
9b32b49
feat: add form orientation property to rich text modal dialogs and co…
yordan-st Aug 4, 2025
fe0e45c
feat: add form orientation accessibility support to dialog forms
yordan-st Aug 6, 2025
e333d9c
chore: changelog update
yordan-st Aug 6, 2025
7ba5467
refactor: improve type safety, prop passing cleanup
yordan-st Aug 8, 2025
71f6a22
refactor: code cleanup
yordan-st Aug 18, 2025
d09a459
chore: better api for widget package.xml
r0b1n Sep 1, 2025
81b9542
chore: update package.xml's to use common format
r0b1n Sep 1, 2025
493b26c
chore: add command to generate package.xml file
r0b1n Sep 1, 2025
cf3a936
fix: allow absent testProject for widgets
r0b1n Sep 1, 2025
3559fba
chore: update version to 4.9.0 in package.json and package.xml
yordan-st Sep 3, 2025
ae98da6
chore(@mendix/rich-text-web): update changelog
uicontent Sep 3, 2025
cffabd5
fix: update props
iobuhov Aug 20, 2025
1aa5874
chore: update changelogs
iobuhov Aug 20, 2025
e300824
chore: update snapshots
iobuhov Aug 20, 2025
4cea9a2
chore: update snapshots
iobuhov Aug 20, 2025
99ef6e1
fix: adjust pseudo-element to improve spacing
yordan-st Sep 2, 2025
4a28dc1
chore: add removal of readmeos file
r0b1n Sep 4, 2025
4a74cce
fix: revert combobox input width
yordan-st Aug 20, 2025
a0930e6
fix: remove class to add to atlas
yordan-st Aug 22, 2025
caef300
chore: add removal of readmeos file (#1881)
r0b1n Sep 8, 2025
8ed842c
Package xml improvements (#1872)
r0b1n Sep 8, 2025
37d7b6a
fix(datagrid-web): preventScroll on column selector focus
rahmanunver Aug 11, 2025
9e6165a
fix: eslint
gjulivan Sep 6, 2025
4b26164
feat: changelog update
yordan-st Aug 14, 2025
962e7ce
refactor: code cleanup
yordan-st Aug 18, 2025
98f9a1b
fix: conflict on rebase
gjulivan Sep 6, 2025
e7e0346
feat: add clear selection hook
iobuhov Aug 27, 2025
d9a6242
feat: add clear selection to module
iobuhov Aug 27, 2025
97f3246
feat: add clear selection event
iobuhov Aug 27, 2025
6ed32de
chore: update changelog
iobuhov Aug 29, 2025
ed3bd2b
chore: update doc comment
iobuhov Aug 29, 2025
d404bae
feat: retrieve pdfjs worker locally instead of cdn
gjulivan Aug 7, 2025
660175b
chore: add readme oss
gjulivan Sep 10, 2025
f947703
fix: update script
gjulivan Sep 10, 2025
8e2b629
fix: removal of readme file
r0b1n Sep 11, 2025
b479e1a
chore(@mendix/document-viewer-web): update changelog
uicontent Sep 11, 2025
b3e8015
fix: document viewer mpk name
gjulivan Sep 11, 2025
cf62968
fix: combobox auto width not working properly
gjulivan Aug 12, 2025
9e164d3
chore: prepare data widget release
gjulivan Sep 11, 2025
0879d20
chore: add readme oss
gjulivan Sep 12, 2025
e51dc98
chore(@mendix/data-widgets): update changelog
uicontent Sep 12, 2025
69fe161
feat(any-chart-web): expose leaflet map instance
rahmanunver Dec 16, 2024
d282417
feat(maps-web): make onClick work and set default to satellite view
dvdkroft Jan 24, 2025
06d7152
feat(maps-web): add GeoJSON feature support and refactor GeoJSON hand…
dvdkroft Jun 12, 2025
ce491d7
chore: wip local changes
Sep 12, 2025
6d1da97
fix(maps-web): fix leaflet-draw implementation issues
Sep 13, 2025
23f44cf
chore(maps-web): commit all remaining widget changes
Sep 13, 2025
b6a2a8d
fix(maps-web): fix drawing tool selection to show only polygon when c…
Sep 13, 2025
bfc71b2
fix(maps-web): fix polygon drawing error preventing multiple points
Sep 13, 2025
c3015e7
fix(maps-web): fix map coordinate offset issues and restore functiona…
Sep 13, 2025
12c693d
feat(maps-web): fix leaflet drawing coordinate jumping and storage is…
Sep 13, 2025
95710fe
fix(maps-web): fix autozoom functionality for initial map load
Sep 13, 2025
b93b68a
feat(maps-web): enhance zoom functionality with provider-specific max…
Sep 13, 2025
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
  •  
  •  
  •  
327 changes: 327 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,327 @@
# GitHub Copilot – PR Review Instructions for Mendix Web Widgets

Use this guide to review both code and workflow. Focus on Mendix pluggable widget conventions, Atlas UI styling, React best practices, and our release process.

## Repo context

- **Monorepo** with packages under `packages/`:
- `packages/pluggableWidgets/*-web`
- `packages/modules/*`
- `packages/customWidgets/*`
- `packages/shared/*` (configs, plugins)
- **Stack**: TypeScript, React, SCSS, Rollup via `@mendix/pluggable-widgets-tools`, Jest/RTL, ESLint/Prettier.
- **Commands** (root): `pnpm lint`, `pnpm test`, `pnpm build`, `pnpm -w changelog`, `pnpm -w version`.

## What to check on every PR

### PR metadata and process

- **Title format**:
- If JIRA: `[XX-000]: description`
- Else: conventional commits (e.g., `feat: ...`, `fix: ...`).
- **Template adherence** (see `.github/pull_request_template.md`):
- Lint/test locally: `pnpm lint`, `pnpm test`.
- New tests for features/bug fixes (unit tests in `src/**/__tests__/*.spec.ts`, E2E tests in `e2e/*.spec.js`).
- Related PRs linked if applicable.
- If XML or behavior changes: ask for docs PR link in `mendix/docs`.
- **Multi-package PRs**: Validate each changed package separately.

### Versioning and changelog (per changed package)

- If runtime code, public API, XML schema, or behavior changes in a package:
- **Require semver bump** in that package's `package.json`.
- **Require `CHANGELOG.md` update** (Keep a Changelog, semver).
- Suggest: `pnpm -w changelog` (or update manually).
- If refactor/docs/tests-only: bump not required (ask author to confirm).
- Multiple changed packages: each needs its own bump and changelog entry.

## Code quality – Mendix pluggable widgets and React

### Mendix-specific

- **XML ↔ TSX alignment**: lowerCamelCase property keys; TS props/types updated with XML changes; unique widget ID; captions/descriptions/defaults valid.
- **Mendix data API**:
- Check `ActionValue.canExecute` before `execute()`.
- Use `EditableValue.setValue()` for two-way binding.
- Render loading/empty states until values are ready.

### React code-logic best practices

- **Hooks and effects**

- Correct `useEffect`/`useMemo`/`useCallback` dependencies; avoid stale closures.
- No side effects in render. Cleanup subscriptions/timers on unmount.
- Guard async effects to avoid setting state after unmount:
```ts
useEffect(() => {
let active = true;
(async () => {
const data = await load();
if (active) setData(data);
})();
return () => {
active = false;
};
}, [load]);
```
- Avoid deriving state directly from props unless necessary; prefer computing from props or synchronize carefully (watch for loops).

- **State management**

- Use functional updates when reading previous state:
```ts
setCount(c => c + 1);
```
- Avoid unnecessary state for values derived from props. Keep state minimal and source-of-truth clear (controlled vs uncontrolled).
- **MobX stores** for complex cross-component state; **React state** for simple UI state; **Mendix props** as source of truth for persistent data.

- **Rendering and lists**

- Use stable, unique `key`s (avoid array index unless list is static).
- Avoid heavy computations in render; memoize when there's proven benefit.
- For large lists/tables, consider virtualization.

- **Performance hygiene**

- Limit `useCallback`/`useMemo` to cases with measurable re-render cost; ensure dependency arrays are correct.
- Avoid creating new objects/arrays/styles inline when passed to children repeatedly; memoize where needed.

- **Composition and props**

- Prefer composition over prop drilling; consider Context when appropriate.
- Don't spread unknown props onto DOM nodes (avoid React unknown prop warnings). Validate/filter props before spreading.

- **Accessibility**

- Semantic elements, proper ARIA, focus management, and keyboard navigation.

- **Error handling and robustness**

- Handle null/undefined from Mendix props; safe optional chaining; avoid non-null assertions unless justified.
- Guard external data parsing; provide graceful fallbacks.
- Avoid `dangerouslySetInnerHTML`; if unavoidable, sanitize input.

- **MobX best practices**
- Use `makeAutoObservable(this)` or `makeObservable(this, { ... })` in store constructors.
- Mark state mutations as `action`; use `computed` for derived values; avoid side effects in computed.
- Use `reaction()` for side effects, not `autorun()` in most cases.
- Integrate with React via `useSubscribe()` hook from `@mendix/widget-plugin-mobx-kit`.
- Keep stores focused and avoid deep nesting; prefer composition over inheritance.

### Styling and theming

- Use **SCSS**; avoid inline styles for static design.
- Prefer **Atlas UI classes** (e.g., `btn`, `badge`); do not override core Atlas classes.
- Prefix custom classes with widget name; BEM-like naming.
- Responsive: relative units/media queries; avoid `!important`.

### Project/tooling consistency

- Follow ESLint/Prettier; do not change existing indentation style.
- For new deps: justify need/size; prefer tree-shakable imports; respect root `pnpm` versions/overrides.
- Don't modify generated bundles/patch files unless intended.

## Heuristics Copilot should apply

### Release/workflow checks

- Code or XML changed in `packages/**/<pkg>/` but no version bump or `CHANGELOG.md`:
- "Behavior changed but no version bump or `CHANGELOG.md`. Please bump semver and add changelog (you can use `pnpm -w changelog`)."
- Features/bug fixes without tests:
- "Please add/adjust unit tests in `src/components/__tests__/` or component tests to cover this change. For user-facing features, consider adding E2E tests in `e2e/`."
- XML changes without TS alignment:
- "XML props changed but TS props/usage aren't aligned. Please update the component props/types and usage."

### React logic checks

- **Effect dependencies/stale closure**:
- If an effect references variables not in the dependency array, request adding them or restructuring.
- **Async effect race**:
- If an async effect sets state without a guard, suggest guarding or aborting as shown above.
- **Functional state updates**:
- If using `setX(x + 1)` with potential stale reads, suggest `setX(x => x + 1)`.
- **Derived state anti-pattern**:
- If `useState(props.someValue)` is used to mirror props without sync logic, suggest computing from props or explaining sync strategy.
- **List keys**:
- If `index` is used as `key` in dynamic lists, request a stable unique key (e.g., id).
- **Unnecessary memo/callback**:
- If `useMemo`/`useCallback` wraps cheap operations or has incorrect deps, suggest removing or fixing deps.
- **Inline allocations**:
- Repeated inline objects/arrays/styles passed to children: suggest memoization to reduce renders.
- **Controlled vs uncontrolled**:
- Inputs switching between `value` and `defaultValue` or missing `onChange` with `value`: flag and ask to make it consistently controlled or uncontrolled.
- **Unknown DOM props**:
- Spreading arbitrary props to DOM nodes: ask to filter out non-standard props.

### MobX logic checks

- **Store setup**:
- If a class has observable state but no `makeObservable`/`makeAutoObservable`, request adding it.
- **Action boundaries**:
- If state is mutated outside `action`, suggest wrapping in `action` or `runInAction`.
- **Computed purity**:
- If `computed` properties have side effects or mutations, suggest moving to `reaction` or regular methods.
- **React integration**:
- If MobX stores are used without `observer` HOC or `useSubscribe` hook, request proper React integration.
- **Store architecture**:
- If stores are deeply nested or overly complex, suggest breaking into focused, composable stores.

### Styling/scroll behavior

- Prefer root-cause layout/size fixes instead of programmatic scroll resets.

## Testing requirements and best practices

### Testing strategy overview

This repository uses a comprehensive three-tier testing strategy:

1. **Unit tests** (Jest + React Testing Library) - Test individual components and functions in isolation
2. **Component tests** - Test React components with Mendix data integration and user interactions
3. **E2E tests** (Playwright) - Test complete user workflows in real Mendix applications

### Unit testing (Jest + RTL)

- **Location**: `src/components/__tests__/*.spec.ts` or `src/__tests__/*.spec.ts`
- **Tools**: Jest, React Testing Library (enzyme-free configuration), `@mendix/widget-plugin-test-utils`
- **Config**: Each package uses `@mendix/pluggable-widgets-tools/test-config/jest.enzyme-free.config.js`
- **Command**: `pnpm test` (package-level) or `pnpm -w test` (workspace-level)

#### Unit test requirements

- **New features**: Must include unit tests covering all logic branches and edge cases
- **Bug fixes**: Add regression tests that would have caught the original bug
- **Component props**: Test all prop combinations, especially error states and loading states
- **Mendix data handling**: Mock Mendix APIs using builders from `@mendix/widget-plugin-test-utils`:

```ts
import { dynamicValue, EditableValueBuilder } from "@mendix/widget-plugin-test-utils";

const mockValue = new EditableValueBuilder().withValue("test").build();
```

- **Error boundaries**: Test error states and graceful fallbacks
- **Accessibility**: Include basic a11y assertions (roles, labels, ARIA attributes)
- **Snapshot tests**: Use sparingly, only for complex DOM structures that are unlikely to change

#### Unit test patterns to review

- **Test file naming**: Must follow `*.spec.ts` convention
- **Test descriptions**: Clear, behavior-focused descriptions ("renders loading state when data is unavailable")
- **Mocking strategy**: Prefer `@mendix/widget-plugin-test-utils` builders over manual mocks
- **Async testing**: Proper use of `waitFor`, `findBy*` queries for async operations
- **Cleanup**: Ensure tests don't leak state between runs

### Component testing

- **Scope**: Test React components integrated with Mendix data layer
- **Focus**: User interactions, data binding, prop changes, widget lifecycle
- **Tools**: Same as unit tests but with full Mendix context and data sources

#### Component test requirements

- **Mendix data integration**: Test with various Mendix data states (loading, empty, error, success)
- **User interactions**: Test clicks, form submissions, keyboard navigation
- **Widget lifecycle**: Test component mount/unmount, prop updates, re-renders
- **Data mutations**: Test `EditableValue.setValue()`, `ActionValue.execute()` calls
- **Validation**: Test form validation, error messages, required field handling

### E2E testing (Playwright)

- **Location**: `e2e/*.spec.js` in each widget package
- **Tools**: Playwright with custom Mendix test project setup via `automation/run-e2e`
- **Config**: `automation/run-e2e/playwright.config.cjs`
- **Commands**:
- `pnpm e2edev` - Development mode with GUI debugger
- `pnpm e2e` - CI mode (headless)

#### E2E test requirements

- **Complete workflows**: Test end-to-end user journeys, not just individual widgets
- **Cross-browser**: Tests run in Chromium (CI extends to other browsers)
- **Visual regression**: Use `toHaveScreenshot()` for visual consistency
- **Data scenarios**: Test with various data configurations from test projects
- **Accessibility**: Include `@axe-core/playwright` accessibility scans
- **Session cleanup**: Always cleanup Mendix sessions to avoid license limits:
```js
test.afterEach("Cleanup session", async ({ page }) => {
await page.evaluate(() => window.mx.session.logout());
});
```

#### E2E test structure

- **Test project**: Each widget has dedicated test project in GitHub (`testProject.githubUrl`, `testProject.branchName`)
- **Page setup**: Use `page.goto("/")` and `page.waitForLoadState("networkidle")`
- **Selectors**: Prefer `mx-name-*` class selectors for Mendix widgets
- **Assertions**: Combine element visibility, screenshot comparisons, and content verification

### Testing coverage expectations

#### For new features

- **Unit tests**: 80%+ code coverage, all public methods and edge cases
- **Component tests**: Key user interactions and data integration points
- **E2E tests**: At least one happy path and one error scenario

#### For bug fixes

- **Regression test**: Unit or component test that reproduces the original bug
- **Fix verification**: Test that confirms the fix works correctly
- **Edge case coverage**: Additional tests for similar potential issues

#### For refactoring

- **Test preservation**: All existing tests should continue to pass
- **Test updates**: Update tests if public APIs change, but avoid unnecessary changes
- **Coverage maintenance**: Code coverage should not decrease

### Test-related heuristics for Copilot

#### Missing test coverage

- New React components without corresponding `.spec.ts` files:
- "New component `ComponentName` is missing unit tests. Please add tests in `src/components/__tests__/ComponentName.spec.ts`."
- Features affecting user workflows without E2E tests:
- "This feature changes user interaction patterns. Please add E2E tests in `e2e/WidgetName.spec.js` or update existing ones."
- Bug fixes without regression tests:
- "Bug fix detected but no regression test found. Please add a test that would have caught this issue."

#### Test quality issues

- Tests using deprecated Enzyme patterns:
- "Please migrate from Enzyme to React Testing Library using `render()` and `screen` queries."
- Hard-coded test data instead of builders:
- "Consider using `@mendix/widget-plugin-test-utils` builders instead of hardcoded mocks for better maintainability."
- E2E tests without session cleanup:
- "E2E tests must include session cleanup to avoid Mendix license limit issues. Add `test.afterEach()` with logout."
- Snapshot tests for dynamic content:
- "Avoid snapshot tests for dynamic content. Use specific assertions instead."

#### Test configuration issues

- Custom Jest config without extending base config:
- "Widget Jest config should extend `@mendix/pluggable-widgets-tools/test-config/jest.enzyme-free.config.js`."
- Missing test project configuration for E2E:
- "Widget package.json missing `testProject.githubUrl` and `testProject.branchName` for E2E tests."
- E2E specs not following naming convention:
- "E2E test files should follow `WidgetName.spec.js` naming convention in `e2e/` directory."

## Scope/Noise reduction

- Focus on: `src/**`, `*.xml`, `*.scss`, `package.json`, `CHANGELOG.md`, build/test config changes.
- Generally ignore: `dist/**`, lockfile-only churn, generated files.

## Quick commands

- Lint: `pnpm lint`
- Test: `pnpm test` (unit tests)
- Build: `pnpm build`
- E2E (dev): `pnpm e2edev` (with GUI debugger)
- E2E (CI): `pnpm e2e` (headless)
- Prepare changelog/version (workspace): `pnpm -w changelog`, `pnpm -w version`

## Tone and format for comments

- Be specific and actionable; reference files/lines.
- Prefer small, concrete suggestions; include short code snippets when helpful.
4 changes: 3 additions & 1 deletion .github/renovate.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"labels": ["dependencies"],
"rebaseLabel": "renovate-rebase",
"branchPrefix": "deps/",
"branchNameStrict": true,
"prHourlyLimit": 5,
"prConcurrentLimit": 5,
"prCreation": "immediate",
Expand All @@ -25,7 +26,8 @@
},
"allowScripts": true,
"ignoreScripts": false,
"ignoreDeps": ["typescript"],
"ignoreDeps": ["typescript", "react", "react-dom", "@types/react", "@types/react-dom"],
"ignorePaths": ["**/customWidgets/**"],
"packageRules": [
{ "matchCategories": ["docker"], "enabled": false },
{ "matchPackagePatterns": ["*"], "rangeStrategy": "bump" },
Expand Down
15 changes: 3 additions & 12 deletions .github/workflows/BuildJobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
target: [build, release]
target: [release]

steps:
- name: Checkout
Expand All @@ -125,16 +125,10 @@ jobs:
key: turbo-cache-${{ runner.os }}-${{ matrix.target }}-${{ env.main_sha }}
restore-keys: |
turbo-cache-${{ runner.os }}-${{ matrix.target }}
- if: runner.os == 'Windows'
name: Set concurrency on Windows
run: echo "task_concurrency=3" >> $env:GITHUB_ENV
- if: runner.os == 'Linux'
name: Set concurrency on Linux
run: echo "task_concurrency=5" >> $GITHUB_ENV
- name: Install dependencies
run: pnpm install
- name: Run ${{ matrix.target }} task
run: pnpm run ${{ matrix.target }} --concurrency=${{ env.task_concurrency }} ${{ env.since_flag }}
run: pnpm run ${{ matrix.target }} --concurrency=1 ${{ env.since_flag }}
env:
# Limit memory to avoid out of memory issues
NODE_OPTIONS: "--max-old-space-size=5120 --max_old_space_size=5120"
Expand Down Expand Up @@ -211,10 +205,7 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: >-
node ./automation/run-e2e/bin/run-e2e-in-chunks.mjs
--chunks ${{ matrix.chunks }}
--index ${{ matrix.index }}
--event-name ${{ github.event_name }}
node ./automation/run-e2e/bin/run-e2e-in-chunks.mjs --chunks ${{ matrix.chunks }} --index ${{ matrix.index }} --event-name ${{ github.event_name }}
- name: Check file existence
id: check_files
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0
Expand Down
Loading