Recent Releases of GreenForce

GreenForce - ui_frontend_5795

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5793...ui_frontend_5795

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5795

Commits

  • 55bfe610: Fixed download on page 2 (mimse)
  • 5c36eef9: Update libs/dh/market-participant/feature-market-participant/src/components/download.component.ts

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • 481e7e15: Update libs/dh/market-participant/feature-grid-areas/src/components/grid-areas.component.ts

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • eb0bdc3a: Update libs/dh/market-participant/feature-organizations/src/components/organizations.component.ts

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • bf83756f: Merge branch 'main' into bugfix/tml-inc0501301-download-af-filer-fra-netomr-der-eller-akt-rregi (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_frontend_5793

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5779...ui_frontend_5793

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5794

Commits

  • 378a3a3d: feat(watt): set week start to Mondag in Dayjs (dzhavat)
  • ff57449b: feat(watt): add one week range selection strategy (dzhavat)
  • f6202acf: fix(watt): add story for one week range selection (dzhavat)
  • dee293f0: QA fixes (github-actions[bot])
  • be90db02: fix(dh): use updateLocale API to set week start (dzhavat)
  • ac16842b: fix(watt): bump to new minor (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5793

Commits

  • 6d27b305: users:manage should have access (mimse)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_frontend_5779

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5791...ui_frontend_5779

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5779

Commits

  • 1490ceae: fix: hide end date for charge link periods in UI

Only display the start date for charge link periods across fees,
tariff/subscriptions tables, and the details drawer. Cancelled
link status badges are preserved. (ManBearTM)

  • 2fc8ad85: fix: restore end date display for tariff/subscriptions and details (ManBearTM)

  • ed6fc441: Revert (ManBearTM)

  • 8dda7d92: Hide end date in bff (ManBearTM)

  • af2d93d2: Merge branch 'main' into hide-charge-link-end-date (ManBearTM)

  • 9e244623: Update mocks (ManBearTM)

  • c1f00b59: refactor: preserve real period, add displayPeriod for fee charge links UI

  • Revert GetPeriod to return the real end date, preserving domain semantics

  • Add GetDisplayPeriod field that hides end date for fee charge types

  • Update schema.graphql to expose the new displayPeriod field

  • Update GraphQL query to fetch displayPeriod alongside period

  • Update UI components to use displayPeriod for display rendering
    while keeping period for domain logic (cancelled status, cancel button)

  • Fix column accessor in fees.ts to return period.start for proper sorting

  • Update mocks to include displayPeriod and restore real period data

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/41dea4e9-698f-48f9-b8f3-a716cc1b0f7f

Co-authored-by: ManBearTM 22732929+ManBearTM@users.noreply.github.com (web-flow)

  • e3b1937c: test: add integration test for fee charge link period end hiding

Assert that GetPeriod returns null end for fee charge links with
different start/end dates, while other charge types keep their
real end date.

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/9a1fd787-4225-4cdf-b03f-21fad34b9659

Co-authored-by: ManBearTM 22732929+ManBearTM@users.noreply.github.com (web-flow)

  • 8e46a750: fix: use period.start as column accessor in fees table for proper sorting

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/9a1fd787-4225-4cdf-b03f-21fad34b9659

Co-authored-by: ManBearTM 22732929+ManBearTM@users.noreply.github.com (web-flow)

  • df3e9e9f: Disable sort for type on fees (always just one type, so whats the point) (ManBearTM)
  • 15d58c85: Merge branch 'main' into hide-charge-link-end-date (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5793

Commits

  • 6d27b305: users:manage should have access (mimse)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_frontend_5791

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5790...ui_frontend_5791

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5791

Commits

  • f76a1b83: feat(dh/metering-point): add ActionRole and roles field to ActionHandler (frontend-specialisten)
  • 5608f58f: feat(dh/metering-point): role-aware filtering in DhActionsRegistry (frontend-specialisten)
  • 5e60dac8: refactor(dh/metering-point): read actor inline and tighten FAS test

Read the selected actor inline inside matchesRoles so role checks
always reflect the current selection instead of a snapshot taken at
registry construction (DhActionsRegistry is providedIn: 'root', so the
old field went stale on in-page actor switch).

Replace the FAS-blocks-execute test with a paired version that first
proves the trigger fires without FAS, then proves FAS blocks it. This
rules out "trigger never fired" as the reason the assertion passes. (frontend-specialisten)

  • 178367a1: feat(dh/metering-point): declare roles per EndOfSupply action

Each EndOfSupply action now declares which actor roles can invoke it,
so per-action visibility is enforced at the registry level instead of
relying solely on the outer visibility gate. Updated the matching test
to reflect that RejectRequest is restricted to the responsible
EnergySupplier. (frontend-specialisten)

  • fe5f9c58: refactor(dh/metering-point): move overview action gating into registry (frontend-specialisten)
  • 7847c11d: refactor(dh/metering-point): clean up overview test and import grouping (frontend-specialisten)
  • 62090154: refactor(dh/metering-point): move details action gating into registry (frontend-specialisten)
  • 195507f9: chore(dh/metering-point): drop unused param in pipe test mock (frontend-specialisten)
  • 2e247eb6: refactor(dh/metering-point): drop redundant supplier role check in matchesRoles

The BFF flag isEnergySupplierResponsible is GLN-keyed and only true when the
active actor is the responsible energy supplier on the metering point. The
explicit marketRole === EnergySupplier check is therefore redundant. Remove
it and the now-impossible test that mocked a non-supplier with isResponsible
set to true. (frontend-specialisten)

  • eec9b373: refactor(dh/metering-point): polish review feedback on flexible action roles

  • Pipe test now asserts isEnergySupplierResponsible is forwarded to the
    registry, both when bound and when defaulted to false.

  • Document the FAS short-circuit in getSupportedActions so future readers
    do not collapse it with the execute-time block.

  • Add ChangeDetectionStrategy.OnPush to overview table component (was
    missing on the original file, parallel to details.ts).

  • Add a positive control assertion to the non-responsible supplier
    details test so the absence of buttons is provably meaningful. (frontend-specialisten)

  • 41db40a1: fix(dh/metering-point): preserve CustomerMoveIn role gate from before refactor

The previous component-level gate (PR #5746) showed CustomerMoveIn actions
only to grid access providers and the responsible energy supplier (plus
FAS for visibility). Leaving the new handler without roles[] silently
widened that gate to any actor reaching the page. Restore the original
union as an explicit roles[] declaration on the handler, matching
EndOfSupply.CancelWorkflow's configuration. Component tests updated to
match the restored behavior. (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5791

Commits

  • f76a1b83: feat(dh/metering-point): add ActionRole and roles field to ActionHandler (frontend-specialisten)
  • 5608f58f: feat(dh/metering-point): role-aware filtering in DhActionsRegistry (frontend-specialisten)
  • 5e60dac8: refactor(dh/metering-point): read actor inline and tighten FAS test

Read the selected actor inline inside matchesRoles so role checks
always reflect the current selection instead of a snapshot taken at
registry construction (DhActionsRegistry is providedIn: 'root', so the
old field went stale on in-page actor switch).

Replace the FAS-blocks-execute test with a paired version that first
proves the trigger fires without FAS, then proves FAS blocks it. This
rules out "trigger never fired" as the reason the assertion passes. (frontend-specialisten)

  • 178367a1: feat(dh/metering-point): declare roles per EndOfSupply action

Each EndOfSupply action now declares which actor roles can invoke it,
so per-action visibility is enforced at the registry level instead of
relying solely on the outer visibility gate. Updated the matching test
to reflect that RejectRequest is restricted to the responsible
EnergySupplier. (frontend-specialisten)

  • fe5f9c58: refactor(dh/metering-point): move overview action gating into registry (frontend-specialisten)
  • 7847c11d: refactor(dh/metering-point): clean up overview test and import grouping (frontend-specialisten)
  • 62090154: refactor(dh/metering-point): move details action gating into registry (frontend-specialisten)
  • 195507f9: chore(dh/metering-point): drop unused param in pipe test mock (frontend-specialisten)
  • 2e247eb6: refactor(dh/metering-point): drop redundant supplier role check in matchesRoles

The BFF flag isEnergySupplierResponsible is GLN-keyed and only true when the
active actor is the responsible energy supplier on the metering point. The
explicit marketRole === EnergySupplier check is therefore redundant. Remove
it and the now-impossible test that mocked a non-supplier with isResponsible
set to true. (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_frontend_5790

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5788...ui_frontend_5790

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5790

Commits

  • f73467f3: chore(deps): bump chromaui/action in the version-updates group

Bumps the version-updates group with 1 update: chromaui/action.

Updates chromaui/action from 16.6.1 to 16.6.3


updated-dependencies:

  • dependency-name: chromaui/action
    dependency-version: 16.6.3
    dependency-type: direct:production
    update-type: version-update:semver-patch
    dependency-group: version-updates
    ...

Signed-off-by: dependabot[bot] support@github.com (web-flow)

  • 26545ebc: Merge branch 'main' into dependabot/github_actions/version-updates-a34c30b96f (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5779

Commits

  • 1490ceae: fix: hide end date for charge link periods in UI

Only display the start date for charge link periods across fees,
tariff/subscriptions tables, and the details drawer. Cancelled
link status badges are preserved. (ManBearTM)

  • 2fc8ad85: fix: restore end date display for tariff/subscriptions and details (ManBearTM)
  • ed6fc441: Revert (ManBearTM)
  • 8dda7d92: Hide end date in bff (ManBearTM)
  • af2d93d2: Merge branch 'main' into hide-charge-link-end-date (ManBearTM)
  • 9e244623: Update mocks (ManBearTM)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_frontend_5788

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5787...ui_frontend_5788

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5788

Commits

  • 18596aa2: chore: remove husky in favor of native git hooks

Drop the husky devDependency in favor of a small postinstall
script that points core.hooksPath at .githooks. The post-merge
hook keeps its existing behavior of running bun install when
bun.lock changes after a pull or merge.

Closes #2485 (frontend-specialisten)

  • 7e9c0c1b: QA fixes (github-actions[bot])

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_frontend_5787

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5786...ui_frontend_5787

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5787

Commits

  • a110b79f: chore(deps): bump @testing-library/user-event from 13.5.0 to 14.6.1

Migrate 17 spec files from the v13 sync API to the v14 async pattern:
introduce userEvent.setup() per test and await every interaction.
Convert the disabled-button toThrow assertion to rejects.toThrow,
and replace skipPointerEventsCheck: true with the global
pointerEventsCheck: 0 option where it was previously used.

The modal "closes on ESC" test now dispatches a synthetic
KeyboardEvent with keyCode 27 to satisfy MatDialog's deprecated
keyCode filter, since user-event v14 + happy-dom no longer
populates that property.

Closes #2481 (frontend-specialisten)

  • 4d39248f: QA fixes (github-actions[bot])
  • fc497f21: test(watt): apply Escape keyCode workaround to modal disables ESC test

Without the synthetic KeyboardEvent dispatch, user-event v14 omits the
deprecated keyCode property and Escape never reaches MatDialog. The
disables ESC test then passed regardless of disableClose, since closed
was never going to be called. Extract the dispatch into a shared helper
and use it in both ESC tests so the disables ESC assertion is now a real
verification of the disableClose: true path.

Refs #2481 (frontend-specialisten)

  • da156452: test(watt): dispatch Escape on drawer host in does-not-call-closed test

user.keyboard sends the event to the focused element, which is body when
the drawer never opened. The keydown then bubbles upward and never
reaches the watt-drawer host listener, so the test passed regardless of
whether the close() short-circuit on isOpen actually worked. Dispatch
the synthetic keydown directly on the drawer element instead, mirroring
the existing closes-on-Escape tests in the same file. The dispatch is
now known to reach the listener (proved by the existing closes-on-Escape
tests that use the identical pattern), so the assertion that closed is
not called is now a real verification of the closed-drawer branch.

Refs #2481 (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] 30 days ago

GreenForce - ui_dotnet_5775

Commits

  • 5b23dd22: feat: adds CPR change buttons (Sejruppen)
  • 9ae3dd59: feat: changes to checkbox and dots faking cpr (Sejruppen)
  • 40cc7280: chore: changes to link button (Sejruppen)
  • e118ea5f: QA fixes (github-actions[bot])
  • 9d5528eb: Merge branch 'main' into update-customer-data/add-cvr-lookup (web-flow)
  • da39267a: Update libs/dh/globalization/assets-localization/src/assets/i18n/da.json

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • acd3d0e1: Merge branch 'refs/heads/main' into update-customer-data/add-cvr-lookup (Sejruppen)
  • ac364d95: feat: adds new CPR component (Sejruppen)
  • 9cfeeed3: Merge branch 'main' into update-customer-data/add-cvr-lookup (Sejruppen)
  • 509d2aa3: chore: updates validator (Sejruppen)
  • e14fdcef: chore: removes file added by mistake (Sejruppen)
  • ec4dafcb: QA fixes (github-actions[bot])
  • 21368fe0: feat: adds error handling and removes fakeCPR (Sejruppen)
  • eb595c17: Merge remote-tracking branch 'origin/update-customer-data/add-cvr-lookup' into update-customer-data/add-cvr-lookup (Sejruppen)
  • e234e145: Merge branch 'main' into update-customer-data/add-cvr-lookup (web-flow)
  • 685a5c2d: Merge branch 'main' into update-customer-data/add-cvr-lookup (Sejruppen)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5786

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5783...ui_frontend_5786

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5786

Commits

  • 1c3fbffd: fix(watt): position date chip overlay below the chip

The hidden input that anchors the Material datepicker overlay carries
the cdk-visually-hidden class, whose specificity beat the chip's
element-only override. The height: auto declaration was dropped,
leaving the input 1px tall at the wrapper's top, so the overlay opened
on top of the chip instead of below it.

Match cdk-visually-hidden's specificity with input.cdk-visually-hidden
(and mat-date-range-input.cdk-visually-hidden) so the input stretches
the full wrapper height. The overlay now anchors at the chip's bottom
edge. Add a panelClass and target the cdk-overlay-pane via :has() with
a small margin-top so there is a visible gap between the chip and the
calendar.

Refs #2588 (frontend-specialisten)

  • e2764f6a: QA fixes (frontend-specialisten)
  • 904cf81c: Merge branch 'main' into fix/2588-date-chip-overlay-position (web-flow)
  • 5f585420: refactor(watt): move date chip overlay gap to shared stylesheet

Move the cdk-overlay-pane:has(...) margin rule out of the range chip
component's styles array into the shared Material datepicker overrides.
Both date chips share the same overlay treatment, so a global stylesheet
already loaded by the Watt theme is the correct home and avoids the
range chip having to ship CSS that also applies to the single-date chip.

Refs #2588 (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5783

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5782...ui_frontend_5783

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5783

Commits

  • 456340a9: Bump Energinet.DataHub.Measurements to 11.3.3-alpha-118 (HenrikSommer)
  • 4e7248e3: Final package (HenrikSommer)
  • 4ea60ff0: Merge remote-tracking branch 'origin/main' into update_measurements_client_11_3_3 (HenrikSommer)
  • 42c8a449: Bump Nodatime and DataHub Core packages (HenrikSommer)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5785

Commits

  • 75d04dce: Update DataHub.WebApi.csproj (RasmusGraabaek)
  • 20336d97: Update EnumerationTests.cs (RasmusGraabaek)
  • 92b23694: Merge branch 'main' into rfg/Update_edi_nuget_package1 (web-flow)
  • bb02cf00: test(api-dh): exclude QuarterHourly from charge resolution V2 cast test

ResolutionV2 in EDI.B2CClient 2.7.0 only supports P1M/P1D/PT1H. The
charges UI never sends QuarterHourly through this path, so iterate the
explicitly supported subset instead of every BFF Resolution value. (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5782

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5749...ui_frontend_5782

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5782

Commits

  • 2a1be024: fix(dh): fix method call in pipe

Co-authored-by: Copilot copilot@github.com (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5784

Commits

  • d7628f55: feat: adds initiate change of supplier (Sejruppen)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5749

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5780...ui_frontend_5749

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5749

Commits

  • 7c41759e: Fix date picker (mimse)
  • 994e788a: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • ea6da7f3: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 62a95cab: Improvment to validations and error handling (mimse)
  • a278058e: QA fixes (github-actions[bot])
  • ed3b2bd4: Clean up (mimse)
  • fc3d1167: Merge branch 'bugfix/stop-date-should-be-later-than-start-date' of https://github.com/Energinet-DataHub/greenforce-frontend into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 0500cc81: Revert (mimse)
  • 9306d402: Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI 175728472+Copilot@users.noreply.github.com (web-flow)

  • 728be88d: Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI 175728472+Copilot@users.noreply.github.com (web-flow)

  • 8242cf47: Danish timezone now used (mimse)
  • 989d1112: Merge branch 'bugfix/stop-date-should-be-later-than-start-date' of https://github.com/Energinet-DataHub/greenforce-frontend into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 20537f8b: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 3059791d: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 8cfa06c1: Fixes (mimse)
  • f08d8f3c: Dont change datepicker (mimse)
  • 5e97eb98: Dont change toast service (mimse)
  • 2b2f3337: Merge branch 'main' into bugfix/stop-date-should-be-later-than-start-date (web-flow)
  • 802c0345: Fixed lint (mimse)
  • 6e1350f5: Merge branch 'bugfix/stop-date-should-be-later-than-start-date' of https://github.com/Energinet-DataHub/greenforce-frontend into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 80ac9228: QA fixes (github-actions[bot])
  • d79020cc: return undefind (mimse)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5749

Commits

  • 7c41759e: Fix date picker (mimse)
  • 994e788a: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • ea6da7f3: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 62a95cab: Improvment to validations and error handling (mimse)
  • a278058e: QA fixes (github-actions[bot])
  • ed3b2bd4: Clean up (mimse)
  • fc3d1167: Merge branch 'bugfix/stop-date-should-be-later-than-start-date' of https://github.com/Energinet-DataHub/greenforce-frontend into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 0500cc81: Revert (mimse)
  • 9306d402: Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI 175728472+Copilot@users.noreply.github.com (web-flow)

  • 728be88d: Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI 175728472+Copilot@users.noreply.github.com (web-flow)

  • 8242cf47: Danish timezone now used (mimse)
  • 989d1112: Merge branch 'bugfix/stop-date-should-be-later-than-start-date' of https://github.com/Energinet-DataHub/greenforce-frontend into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 20537f8b: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 3059791d: Merge remote-tracking branch 'origin' into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 8cfa06c1: Fixes (mimse)
  • f08d8f3c: Dont change datepicker (mimse)
  • 5e97eb98: Dont change toast service (mimse)
  • 2b2f3337: Merge branch 'main' into bugfix/stop-date-should-be-later-than-start-date (web-flow)
  • 802c0345: Fixed lint (mimse)
  • 6e1350f5: Merge branch 'bugfix/stop-date-should-be-later-than-start-date' of https://github.com/Energinet-DataHub/greenforce-frontend into bugfix/stop-date-should-be-later-than-start-date (mimse)
  • 80ac9228: QA fixes (github-actions[bot])

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5780

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5777...ui_frontend_5780

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5780

Commits

  • 705813e6: fix(api-dh): add revision log to cpr query

Co-authored-by: Copilot copilot@github.com (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5780

Commits

  • 705813e6: fix(api-dh): add revision log to cpr query

Co-authored-by: Copilot copilot@github.com (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5777

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5716...ui_frontend_5777

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5777

Commits

  • d50b602f: feat: add [UseRevisionLog] to all charge operations (ManBearTM)
  • 1a7fddf5: test: add revision log coverage tests for charge operations (ManBearTM)
  • 88cd7650: refactor: inline CreateChargeInput and UpdateChargeInput parameters

This ensures the [UseRevisionLog] middleware can detect the 'id'
parameter for UpdateChargeAsync, populating affectedEntityKey correctly.
The GraphQL schema is unchanged due to HotChocolate mutation conventions. (ManBearTM)

  • 6bf15c81: refactor: remove CreateChargeInput and UpdateChargeInput models

Inline the parameters directly in IChargesClient, ChargesClient, and
ChargeNode for consistency with the other charge operations. (ManBearTM)

  • 8f4637aa: Formatting (ManBearTM)
  • e145a778: Merge branch 'main' into feat/add-revision-log-to-charges (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5778

Commits

  • ce2e619e: feat: adds phone number pipe (Sejruppen)
  • 6c46378f: Merge branch 'main' into fix/add-plus-on-phone

Conflicts:

libs/dh/shared/data-access-graphql/schema.graphql (Sejruppen)

  • db412612: QA fixes (github-actions[bot])

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5716

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5776...ui_frontend_5716

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5716

Commits

  • 01c45ddc: chore(deps): bump chromaui/action

Bumps the version-updates group with 1 update in the / directory: chromaui/action.

Updates chromaui/action from 15.3.1 to 16.6.1


updated-dependencies:

  • dependency-name: chromaui/action
    dependency-version: 16.3.0
    dependency-type: direct:production
    update-type: version-update:semver-major
    dependency-group: version-updates
    ...

Signed-off-by: dependabot[bot] support@github.com (web-flow)

  • 7994e341: Merge branch 'main' into dependabot/github_actions/version-updates-0acc064ef1 (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5776

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5774...ui_frontend_5776

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5776

Commits

  • 871586f4: fix: correct RSM-035 and RSM-031 translation names

  • RSM-035: 'Anmod om priser' -> 'Anmodning om priser' (accept)

  • RSM-035: 'Afvis anmod om priser' -> 'Afvisning af anmodning om priser' (reject)

  • RSM-031: 'Information om pristilknytning' -> 'Information om pristilknytninger' (plural, 4 locations)

  • Updated corresponding English translations for RSM-035

Closes Energinet-DataHub/Internal-Repo#3525 (ManBearTM)

  • 39f98c65: fix: update remaining 'price list' to 'prices' in English translations (ManBearTM)
  • e3b2c3dc: Update libs/dh/globalization/assets-localization/src/assets/i18n/en.json

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5775

Commits

  • 5b23dd22: feat: adds CPR change buttons (Sejruppen)
  • 9ae3dd59: feat: changes to checkbox and dots faking cpr (Sejruppen)
  • 40cc7280: chore: changes to link button (Sejruppen)
  • e118ea5f: QA fixes (github-actions[bot])
  • 9d5528eb: Merge branch 'main' into update-customer-data/add-cvr-lookup (web-flow)
  • da39267a: Update libs/dh/globalization/assets-localization/src/assets/i18n/da.json

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • acd3d0e1: Merge branch 'refs/heads/main' into update-customer-data/add-cvr-lookup (Sejruppen)
  • ac364d95: feat: adds new CPR component (Sejruppen)
  • 9cfeeed3: Merge branch 'main' into update-customer-data/add-cvr-lookup (Sejruppen)
  • 509d2aa3: chore: updates validator (Sejruppen)
  • e14fdcef: chore: removes file added by mistake (Sejruppen)
  • ec4dafcb: QA fixes (github-actions[bot])
  • 21368fe0: feat: adds error handling and removes fakeCPR (Sejruppen)
  • eb595c17: Merge remote-tracking branch 'origin/update-customer-data/add-cvr-lookup' into update-customer-data/add-cvr-lookup (Sejruppen)
  • e234e145: Merge branch 'main' into update-customer-data/add-cvr-lookup (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5775

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5772...ui_frontend_5775

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5753

Commits

  • 5b23dd22: feat: adds CPR change buttons (Sejruppen)
  • 9ae3dd59: feat: changes to checkbox and dots faking cpr (Sejruppen)
  • 40cc7280: chore: changes to link button (Sejruppen)
  • e118ea5f: QA fixes (github-actions[bot])
  • 9d5528eb: Merge branch 'main' into update-customer-data/add-cvr-lookup (web-flow)
  • da39267a: Update libs/dh/globalization/assets-localization/src/assets/i18n/da.json

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • acd3d0e1: Merge branch 'refs/heads/main' into update-customer-data/add-cvr-lookup (Sejruppen)
  • ac364d95: feat: adds new CPR component (Sejruppen)
  • 9cfeeed3: Merge branch 'main' into update-customer-data/add-cvr-lookup (Sejruppen)
  • 509d2aa3: chore: updates validator (Sejruppen)
  • e14fdcef: chore: removes file added by mistake (Sejruppen)
  • ec4dafcb: QA fixes (github-actions[bot])
  • 21368fe0: feat: adds error handling and removes fakeCPR (Sejruppen)
  • eb595c17: Merge remote-tracking branch 'origin/update-customer-data/add-cvr-lookup' into update-customer-data/add-cvr-lookup (Sejruppen)
  • e234e145: Merge branch 'main' into update-customer-data/add-cvr-lookup (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5774

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5772...ui_frontend_5774

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5774

Commits

  • 80855c80: fix(e2e): bump auth setup timeout and split MSAL hash wait

Acceptance runs on dev_001 fail intermittently because the default 30s test
budget is consumed by the real B2C redirect chain and token exchange before
the post-login profileMenu wait gets a chance. Bump the setup test timeout
to 120s and add an explicit waitForURL that completes when MSAL has cleared
the #state hash, which improves failure observability when MSAL itself is
the bottleneck.

Refs #5729 (frontend-specialisten)

  • 9c6e719a: fix(e2e): tighten waitForURL predicate to require app host

Copilot review pointed out that the predicate !url.hash.includes('state=')
resolves immediately on the B2C confirm URL (which has no hash), so it never
actually waits for MSAL to consume the auth response. Add a hostname check
against baseURL so the predicate only succeeds once we are back on the app,
and also defensively cover ?code= in case responseMode is ever flipped to
query (currently the MSAL config in dh-b2c-config.ts uses the default
fragment mode).

Refs #5774 (frontend-specialisten)

  • 3e0634f3: QA fixes (github-actions[bot])
  • 4392527f: fix(e2e): use structured URL parsing for MSAL auth-param check

Copilot review pointed out that string includes('state=') is brittle (can
match unrelated substrings) and that code should also be checked in the
hash and state in the query, in case the MSAL response mode is ever
flipped to query. Switch to URLSearchParams parsing so we structurally
assert that neither code nor state appear in either location.

Refs #5774 (frontend-specialisten)

  • baa93618: QA fixes (github-actions[bot])
  • 36a7f948: refactor(e2e): hoist appHost to a single derivation

Copilot noted that cookieDomain and appHost computed the same value from
baseURL with identical fallback. Hoist the derivation to a single appHost
constant near the top of the setup so the cookie-consent step and the
post-login URL gate stay in sync if the fallback logic ever changes.

Refs #5774 (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5772

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5770...ui_frontend_5772

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5772

Commits

  • 3a481327: Nuget update (RasmusGraabaek)
  • 47fb6818: Merge branch 'main' into rfg/update_process_manager_client (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5770

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5773...ui_frontend_5770

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5770

Commits

  • 4ed2a51a: feat: adds check for name to get correct primary name (Sejruppen)
  • 260b7873: Merge branch 'main' into update-customer-data/fix-cvr-cpr (Sejruppen)
  • f6976127: feat: updates logic to never show wrong data (Sejruppen)
  • 4ecbad21: QA fixes (github-actions[bot])
  • 2f479856: feat: adds failsafe (Sejruppen)
  • 0335ea53: Merge remote-tracking branch 'origin/update-customer-data/fix-cvr-cpr' into update-customer-data/fix-cvr-cpr (Sejruppen)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5774

Commits

  • 80855c80: fix(e2e): bump auth setup timeout and split MSAL hash wait

Acceptance runs on dev_001 fail intermittently because the default 30s test
budget is consumed by the real B2C redirect chain and token exchange before
the post-login profileMenu wait gets a chance. Bump the setup test timeout
to 120s and add an explicit waitForURL that completes when MSAL has cleared
the #state hash, which improves failure observability when MSAL itself is
the bottleneck.

Refs #5729 (frontend-specialisten)

  • 9c6e719a: fix(e2e): tighten waitForURL predicate to require app host

Copilot review pointed out that the predicate !url.hash.includes('state=')
resolves immediately on the B2C confirm URL (which has no hash), so it never
actually waits for MSAL to consume the auth response. Add a hostname check
against baseURL so the predicate only succeeds once we are back on the app,
and also defensively cover ?code= in case responseMode is ever flipped to
query (currently the MSAL config in dh-b2c-config.ts uses the default
fragment mode).

Refs #5774 (frontend-specialisten)

  • 3e0634f3: QA fixes (github-actions[bot])
  • 4392527f: fix(e2e): use structured URL parsing for MSAL auth-param check

Copilot review pointed out that string includes('state=') is brittle (can
match unrelated substrings) and that code should also be checked in the
hash and state in the query, in case the MSAL response mode is ever
flipped to query. Switch to URLSearchParams parsing so we structurally
assert that neither code nor state appear in either location.

Refs #5774 (frontend-specialisten)

  • baa93618: QA fixes (github-actions[bot])
  • 36a7f948: refactor(e2e): hoist appHost to a single derivation

Copilot noted that cookieDomain and appHost computed the same value from
baseURL with identical fallback. Hoist the derivation to a single appHost
constant near the top of the setup so the cookie-consent step and the
post-login URL gate stay in sync if the fallback logic ever changes.

Refs #5774 (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5773

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5771...ui_frontend_5773

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5773

Commits

  • cea3acc9: fix(dh): add brs-006 step translations

Co-authored-by: Copilot copilot@github.com (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5771

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5729...ui_frontend_5771

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5771

Commits

  • 7f367b05: Save the vibes (ManBearTM)
  • 60a0ca21: Merge branch 'main' into fix/charges-display-single-day-periods-better (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5766

Commits

  • bed036ac: fix(dh): adjustments to fees under charge links (dzhavat)
  • 66469da8: fix(dh): disable input alias lint (dzhavat)
  • 0d80f939: Merge branch 'main' into fix-353 (web-flow)
  • ca9d2c5f: fix(dh): feedback adjustments

Co-authored-by: Copilot copilot@github.com (dzhavat)

  • fc84e507: Merge branch 'main' into fix-353 (web-flow)
  • 3a274c7d: fix(dh): minor adjustments (dzhavat)
  • d7d22a5e: fix(dh): feedback adjustments

Co-authored-by: Copilot copilot@github.com (dzhavat)

  • 5a247d6e: fix(dh): remove type (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5716

Commits

  • bf06e006: chore(deps): bump chromaui/action

Bumps the version-updates group with 1 update in the / directory: chromaui/action.

Updates chromaui/action from 15.3.1 to 16.6.0


updated-dependencies:

  • dependency-name: chromaui/action
    dependency-version: 16.3.0
    dependency-type: direct:production
    update-type: version-update:semver-major
    dependency-group: version-updates
    ...

Signed-off-by: dependabot[bot] support@github.com (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5729

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5769...ui_frontend_5729

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5753

Commits

  • 5b23dd22: feat: adds CPR change buttons (Sejruppen)
  • 9ae3dd59: feat: changes to checkbox and dots faking cpr (Sejruppen)
  • 40cc7280: chore: changes to link button (Sejruppen)
  • e118ea5f: QA fixes (github-actions[bot])
  • 9d5528eb: Merge branch 'main' into update-customer-data/add-cvr-lookup (web-flow)
  • da39267a: Update libs/dh/globalization/assets-localization/src/assets/i18n/da.json

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5729

Commits

  • ae760f44: Initial plan for Cypress to Playwright migration

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • e531368b: Rewrite e2e tests from Cypress to Playwright

  • Add @nx/playwright and @playwright/test as dependencies

  • Create playwright.config.ts and playwright-acceptance-tests.config.ts

  • Rewrite all e2e test files (.cy.ts → .spec.ts)

  • Update project.json with Playwright targets

  • Update nx.json to use @nx/playwright/plugin

  • Update CI workflow (pr.yml) for Playwright

  • Remove Cypress dependencies, configs, and support files

  • Remove wholesale Cypress component test files

  • Update documentation and .gitignore

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • c234b806: Remove package-lock.json (project uses bun.lock)

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 9240bdd2: Update bun.lock for Cypress to Playwright migration

  • Add @nx/playwright@22.6.3 and @playwright/test@1.59.1

  • Update playwright to 1.59.1 and playwright-core to 1.59.1

  • Remove direct Cypress dependencies (cypress, @bahmutov/cypress-esbuild-preprocessor,
    @cypress/webpack-dev-server, @testing-library/cypress, eslint-plugin-cypress)

  • Retain @nx/cypress as transitive dependency of @nx/storybook

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f2e67eab-e855-4d06-bc92-17a29b659e5a

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 7eb5a386: chore: bump bun.lock file (dzhavat)
  • 270f6006: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 80e1cb8c: QA fixes (github-actions[bot])
  • 8a8fc4f2: Add cookie consent and B2C login helpers for Playwright e2e tests

Create dh-test.ts with Playwright fixtures that provide:

  • removeCookieBanner: sets CookieInformationConsent cookie to dismiss the banner
  • login: performs B2C authentication via DH_E2E_USERNAME/DH_E2E_PASSWORD env vars

Update app-shell, language-selection, and redirect-to-initial-url tests
to use the new fixtures with beforeEach hooks, matching the original
Cypress test behavior.

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 8db0e683: Remove unused baseURL variable in dh-test.ts

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 2dd54096: ci: install Playwright browsers on Nx Cloud agents

The e2e target is distributed via --distribute-on='3 linux-large', so
browsers must be on the agents, not on the orchestrator. The install
step in pr.yml ran only on the main runner, leaving agents without
a browser and failing with 'Executable doesn't exist' at the agent
cache path. (frontend-specialisten)

  • a766ac89: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright

Co-authored-by: frontend-specialisten 86852536+frontend-specialisten@users.noreply.github.com (web-flow)

  • 38327501: QA fixes (github-actions[bot])

  • 3801b098: chore(e2e): address review feedback on Playwright migration

  • Move dh-test.ts to src/fixtures/ per Playwright best-practices layout

  • Replace CSS selectors with semantic locators (getByRole with name filter
    verified against dev003, getByTestId on selected market participant)

  • Add data-testid='selectedMarketParticipant' on the clickable container

  • Harden playwright configs: fullyParallel: true, CI retries, blob+html
    reporter in CI, video: retain-on-failure

  • Project target uses 'bun playwright test' over 'bunx'

  • Replace every bunx with bun (local binary only, no network fallback)

  • Fix GitHub Actions input injection in is-affected composite action
    (move inputs to env block, use process.env.PROJECT in node -e)

  • Drop dead DH_E2E_B2C_URL env var and redundant orchestrator-side
    Playwright install; add best-effort merge-reports step

  • Normalize dashes in docs/dh/testing.md (frontend-specialisten)

  • b0e5b422: ci: move nx start-ci-run after bun install

bun nx requires the binary in node_modules/.bin/ (it does not
fall back to the npm registry like bunx would). Running start-ci-run
before the install step left nx unresolved and killed the orchestrator
job immediately. Reordering keeps Nx Cloud DTE bootstrap working without
needing bunx. (frontend-specialisten)

  • 61116777: QA fixes (github-actions[bot])
  • 15fc12f3: feat(e2e): authenticate via storageState setup project

Mirror the cy.session caching pattern by doing UI login once in a
setup project and saving the authenticated browser context to
apps/dh/e2e-dh/.auth/user.json. The main chromium project then
loads that storageState and depends on setup.

  • Add apps/dh/e2e-dh/src/e2e/auth.setup.ts using semantic locators
    on both the app login button and the B2C form (getByLabel on
    Mailadresse/Adgangskode, getByRole for Log på)
  • Treat the authenticated shell (profileMenu testid) as the
    success marker so the setup does not hardcode default routes
  • Gitignore the generated .auth/ directory
  • Delete the dh-test.ts fixture; specs import from @playwright/test
  • Remove test.skip() from all four specs
  • Use test.use({ storageState: { cookies: [], origins: [] } })
    for the one test that requires an unauthenticated context
  • Close the auto-opening 'New search' dialog on /message-archive
    before interacting with elements behind its backdrop
  • Switch menu interactions to semantic getByRole('menuitem', ...) (frontend-specialisten)
  • 7c76d442: fix(e2e): use role-scoped locators for B2C form and pin Danish locale

Root cause: getByLabel(/mailadresse|email/i) matched both the
B2C form's aria-label and the email input's aria-label, tripping
strict mode. Scope to textbox role so only inputs are considered.

Playwright's default browser locale is en-US, which caused B2C to
render in English on CI while the app renders in Danish. Pin
use.locale to da-DK so both sides are consistent with the existing
Danish heading assertions in the specs. (frontend-specialisten)

  • 2da30c9e: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 477692a5: QA fixes (github-actions[bot])
  • 54409b8e: fix(e2e): accept self-signed cert for service worker registration

The app-dh:serve:mocked dev server runs over HTTPS with a self-signed
localhost.crt. ignoreHTTPSErrors lets Playwright's browser navigate
the page, but Chrome applies stricter rules to service worker script
fetching: registration of mockServiceWorker.js fails with
'An SSL certificate error occurred when fetching the script'.

Without the MSW service worker, post-login API calls to the BFF
(GetUserActors) fall through to the real port 5001 where the BFF
has crashed (unrelated AzureAppConfiguration issue), and the app
hangs on a blank page.

Pass --ignore-certificate-errors via launchOptions.args so Chrome
trusts the self-signed cert for the service worker script as well. (frontend-specialisten)

  • 27099024: fix(e2e): persist MSAL sessionStorage across tests

storageState only captures cookies + localStorage, but MSAL is
configured with BrowserCacheLocation.SessionStorage
(libs/dh/auth/feature-msal/src/dh-b2c-config.ts:41). Without
sessionStorage replay the main project contexts had no tokens and
the app redirected straight back to /login on every test.

  • auth.setup.ts now serialises sessionStorage to
    apps/dh/e2e-dh/.auth/session.json alongside user.json.
  • fixtures/dh-test.ts provides a context override that injects the
    captured sessionStorage via addInitScript on every new page,
    gated by an authenticated test option.
  • The 'Before login' describe sets authenticated: false next to the
    empty storageState so the unauthenticated flow stays intact. (frontend-specialisten)
  • 7ea308a5: fix(e2e): hydrate sessionStorage once via page.evaluate, speed up CI

The previous addInitScript approach re-injected MSAL tokens on every
navigation, so even after a logout MSAL's cleared sessionStorage was
immediately re-seeded and the app treated the user as authenticated.

Switch to page.evaluate after a single goto('/') inside the page
fixture. The seed happens once per test; subsequent navigations rely
on the browser's normal sessionStorage persistence, and a real logout
can actually clear the session.

Also temporarily disable lint, license, format, watt-bump, QA-fix
commit, and the test/build/package nx run so we iterate faster on
the e2e flow. These MUST be re-enabled before merge. (frontend-specialisten)

  • 0bb8cf6e: fix(e2e): handle MSAL race in setup and Watt modal close button

Three issues from the previous CI run:

  1. auth.setup.ts could read sessionStorage before MSAL had finished
    writing its keys, racing with a token-refresh navigation and
    throwing 'Execution context was destroyed'. Now poll until at
    least one msal.* key exists before serialising.

  2. WattModal puts the close button's aria-label on the
    wrapper, not the inner native . Role queries with
    name=/close/i never matched, so the click timed out. Press Escape
    instead, since Watt modals close on Escape by default.

  3. The 'Fremsoeg forretningsbeskeder' heading occasionally needs more
    than the default 6s expect timeout to render after first sign-in
    on a cold MSW worker; bump to 15s for the language-selection spec
    where this manifested. (frontend-specialisten)

  • ffb0b28a: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • cca0e03c: fix(api-dh): upgrade transitive OpenTelemetry packages to 1.15.3

Three GHSAs were published against OpenTelemetry.Api 1.8.1 / 1.14.0
and OpenTelemetry.Exporter.OpenTelemetryProtocol 1.14.0 after main
was last built green. With TreatWarningsAsErrors=true, NU1902 turns
those advisories into build failures, blocking every new build.

The packages are pulled in transitively via
Azure.Monitor.OpenTelemetry.AspNetCore. Add explicit
PackageReferences in Directory.Build.props at the api-dh source
level (covers both DataHub.WebApi and DataHub.WebApi.Tests) so
NuGet uses the patched 1.15.3 instead of the older transitive
versions.

Patched versions per GitHub advisories:

  • GHSA-g94r-2vxg-569j: OpenTelemetry.Api 1.15.3
  • GHSA-mr8r-92fq-pj8p: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3
  • GHSA-q834-8qmm-v933: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.2 (frontend-specialisten)
  • 53f2b50d: ci: re-enable disabled steps so build artefacts are real

Disabling lint/build/test for faster e2e iteration backfired:
the dev-server compile produced TS errors because graphql-codegen
outputs were not properly invalidated when the e2e task was the
only consumer (cache-hit on dh-shared-domain:generate restored
stale outputs). Tests still appeared green because Vite serves
through TS errors and our specs do not exercise the broken
features.

Restore the original step ordering so a passing CI actually means
a clean build. (frontend-specialisten)

  • 5caf6a44: QA fixes (github-actions[bot])
  • ba1655ef: Revert OpenTelemetry pinning, handled on main (frontend-specialisten)
  • 1b248f28: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • fdf91528: fix(e2e): let nxE2EPreset own reporter and parallelism config

The preset already configures fullyParallel: true, retries: 2 (CI),
and an html + (CI-only) blob reporter pair with output paths under
dist/.playwright//. Those paths are declared outputs of
the e2e target, so Nx Cloud syncs them from distributed agents to
the orchestrator where the pr.yml merge-reports step runs.

The previous custom reporter override placed blob-report/ and
playwright-report/ in the project CWD (apps/dh/e2e-dh/), outside
the declared output tree. In a sharded run those would never reach
the orchestrator, leaving the merge step with nothing to merge.

Drop the duplicate fullyParallel and retries entries while we are
at it; pass openHtmlReport: 'never' to the preset to keep the
no-auto-open behaviour the explicit reporter previously provided.

Verified locally: with CI=true, blob lands at
dist/.playwright/apps/dh/e2e-dh/blob-report/report.zip, html at
dist/.playwright/apps/dh/e2e-dh/playwright-report/index.html, and
'bun playwright merge-reports --reporter html ' produces
a unified report at workspace-root playwright-report/. (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5769

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5746...ui_frontend_5769

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5769

Commits

  • ba5f620c: chore: updates translation (Sejruppen)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5746

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5768...ui_frontend_5746

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5746

Commits

  • 056f32b6: feat(dh/metering-point): gate process actions on supplier responsibility

Only the energy supplier responsible for a metering point may perform
the process-related actions. A non-responsible supplier now sees no
action buttons and no FAS-style informational text in the process
overview and the details drawer.

Resolve the responsibility flag once at route activation and bind it
as an input to both components, mirroring how meteringPointId flows
through the same route tree. Grid access providers and administrator
FAS users are unaffected.

Refs #1471 (frontend-specialisten)

  • 1a3b6bf9: QA fixes (github-actions[bot])
  • 91c57fc3: Merge remote-tracking branch 'origin/main' into feat/1471-supplier-responsibility-process-actions (frontend-specialisten)
  • 95db74f2: chore: remove stray terminalOutput file (frontend-specialisten)
  • 0b23c3a1: refactor(dh/metering-point): address PR review on responsibility gate

Use the shared query helper in the route resolver for consistent
errorPolicy handling, and derive the supplier market-role synchronously
from the selected actor instead of from token claims. The sync derivation
avoids a brief flicker where non-responsible suppliers would see action
buttons until the toSignal initial value resolved.

Refs #1471 (frontend-specialisten)

  • 1e635cd2: Merge branch 'main' into feat/1471-supplier-responsibility-process-actions (web-flow)
  • 2f4db2d8: refactor(dh/metering-point): tighten responsibility gate consistency

Type the resolver's inherited route data with a named interface so a
rename in the parent resolver fails type-checking instead of silently
returning undefined. Guard details' executeAction on canPerformActions
(ownership and not FAS) to match the overview component's guard shape.

Refs #1471 (frontend-specialisten)

  • 89c40e13: QA fixes (github-actions[bot])
  • 252d0d04: refactor(dh/metering-point): invert responsibility check to positive form

Replace isNonResponsibleSupplier with isResponsibleSupplier and
introduce hasMeteringPointAccess (grid access provider or responsible
supplier) so the authorization gate reads forward instead of asking the
reader to mentally negate a "non-X" check at three call sites.

Aligns details.ts with overview.ts by adding hasGridAccessProviderRole
so both components express the same rule explicitly: a user sees actions
when they hold a legitimate relation to the metering point, or when they
are FAS and not currently acting as a supplier.

Refs #1471 (frontend-specialisten)

  • 547c82e0: refactor(dh/metering-point): drop redundant supplier role guard

The route resolver returns isEnergySupplierResponsible based on whether
the active actor's GLN matches the metering point's energy supplier, so
the flag is already false for non-supplier actors. AND'ing it with
hasEnergySupplierRole adds no protection and obscures the intent: the
flag itself is the full domain truth.

Refs #1471 (frontend-specialisten)

  • 8a60963d: Merge remote-tracking branch 'origin/main' into feat/1471-supplier-responsibility-process-actions (frontend-specialisten)
  • e60c32f3: refactor(dh/metering-point): drop FAS supplier-role guard

A FAS multitenancy claim and actor.marketRole === EnergySupplier
cannot co-occur: selecting a supplier actor switches the BFF token to
that actor's claims and drops the multitenancy bit. So
!hasEnergySupplierRole is implied by isFas(), and the supplier-role
field is no longer used anywhere.

Removes the now-impossible test that mocked both flags simultaneously.

Refs #1471 (frontend-specialisten)

  • 96dac161: QA fixes (github-actions[bot])

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5768

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5767...ui_frontend_5768

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5768

Commits

  • 9e4cce90: fix(dh): add support for brs-037 (dzhavat)
  • 985d56f8: fix(dh): fix translation (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5767

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5744...ui_frontend_5767

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5767

Commits

  • bf0bb132: Fix sorting and order of columns (ManBearTM)
  • bb73e9d8: Add generate to tasks (ManBearTM)
  • 553c5afb: Update tasks (ManBearTM)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5729

Commits

  • ae760f44: Initial plan for Cypress to Playwright migration

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • e531368b: Rewrite e2e tests from Cypress to Playwright

  • Add @nx/playwright and @playwright/test as dependencies

  • Create playwright.config.ts and playwright-acceptance-tests.config.ts

  • Rewrite all e2e test files (.cy.ts → .spec.ts)

  • Update project.json with Playwright targets

  • Update nx.json to use @nx/playwright/plugin

  • Update CI workflow (pr.yml) for Playwright

  • Remove Cypress dependencies, configs, and support files

  • Remove wholesale Cypress component test files

  • Update documentation and .gitignore

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • c234b806: Remove package-lock.json (project uses bun.lock)

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 9240bdd2: Update bun.lock for Cypress to Playwright migration

  • Add @nx/playwright@22.6.3 and @playwright/test@1.59.1

  • Update playwright to 1.59.1 and playwright-core to 1.59.1

  • Remove direct Cypress dependencies (cypress, @bahmutov/cypress-esbuild-preprocessor,
    @cypress/webpack-dev-server, @testing-library/cypress, eslint-plugin-cypress)

  • Retain @nx/cypress as transitive dependency of @nx/storybook

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f2e67eab-e855-4d06-bc92-17a29b659e5a

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 7eb5a386: chore: bump bun.lock file (dzhavat)
  • 270f6006: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 80e1cb8c: QA fixes (github-actions[bot])
  • 8a8fc4f2: Add cookie consent and B2C login helpers for Playwright e2e tests

Create dh-test.ts with Playwright fixtures that provide:

  • removeCookieBanner: sets CookieInformationConsent cookie to dismiss the banner
  • login: performs B2C authentication via DH_E2E_USERNAME/DH_E2E_PASSWORD env vars

Update app-shell, language-selection, and redirect-to-initial-url tests
to use the new fixtures with beforeEach hooks, matching the original
Cypress test behavior.

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 8db0e683: Remove unused baseURL variable in dh-test.ts

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 2dd54096: ci: install Playwright browsers on Nx Cloud agents

The e2e target is distributed via --distribute-on='3 linux-large', so
browsers must be on the agents, not on the orchestrator. The install
step in pr.yml ran only on the main runner, leaving agents without
a browser and failing with 'Executable doesn't exist' at the agent
cache path. (frontend-specialisten)

  • a766ac89: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright

Co-authored-by: frontend-specialisten 86852536+frontend-specialisten@users.noreply.github.com (web-flow)

  • 38327501: QA fixes (github-actions[bot])

  • 3801b098: chore(e2e): address review feedback on Playwright migration

  • Move dh-test.ts to src/fixtures/ per Playwright best-practices layout

  • Replace CSS selectors with semantic locators (getByRole with name filter
    verified against dev003, getByTestId on selected market participant)

  • Add data-testid='selectedMarketParticipant' on the clickable container

  • Harden playwright configs: fullyParallel: true, CI retries, blob+html
    reporter in CI, video: retain-on-failure

  • Project target uses 'bun playwright test' over 'bunx'

  • Replace every bunx with bun (local binary only, no network fallback)

  • Fix GitHub Actions input injection in is-affected composite action
    (move inputs to env block, use process.env.PROJECT in node -e)

  • Drop dead DH_E2E_B2C_URL env var and redundant orchestrator-side
    Playwright install; add best-effort merge-reports step

  • Normalize dashes in docs/dh/testing.md (frontend-specialisten)

  • b0e5b422: ci: move nx start-ci-run after bun install

bun nx requires the binary in node_modules/.bin/ (it does not
fall back to the npm registry like bunx would). Running start-ci-run
before the install step left nx unresolved and killed the orchestrator
job immediately. Reordering keeps Nx Cloud DTE bootstrap working without
needing bunx. (frontend-specialisten)

  • 61116777: QA fixes (github-actions[bot])
  • 15fc12f3: feat(e2e): authenticate via storageState setup project

Mirror the cy.session caching pattern by doing UI login once in a
setup project and saving the authenticated browser context to
apps/dh/e2e-dh/.auth/user.json. The main chromium project then
loads that storageState and depends on setup.

  • Add apps/dh/e2e-dh/src/e2e/auth.setup.ts using semantic locators
    on both the app login button and the B2C form (getByLabel on
    Mailadresse/Adgangskode, getByRole for Log på)
  • Treat the authenticated shell (profileMenu testid) as the
    success marker so the setup does not hardcode default routes
  • Gitignore the generated .auth/ directory
  • Delete the dh-test.ts fixture; specs import from @playwright/test
  • Remove test.skip() from all four specs
  • Use test.use({ storageState: { cookies: [], origins: [] } })
    for the one test that requires an unauthenticated context
  • Close the auto-opening 'New search' dialog on /message-archive
    before interacting with elements behind its backdrop
  • Switch menu interactions to semantic getByRole('menuitem', ...) (frontend-specialisten)
  • 7c76d442: fix(e2e): use role-scoped locators for B2C form and pin Danish locale

Root cause: getByLabel(/mailadresse|email/i) matched both the
B2C form's aria-label and the email input's aria-label, tripping
strict mode. Scope to textbox role so only inputs are considered.

Playwright's default browser locale is en-US, which caused B2C to
render in English on CI while the app renders in Danish. Pin
use.locale to da-DK so both sides are consistent with the existing
Danish heading assertions in the specs. (frontend-specialisten)

  • 2da30c9e: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 477692a5: QA fixes (github-actions[bot])
  • 54409b8e: fix(e2e): accept self-signed cert for service worker registration

The app-dh:serve:mocked dev server runs over HTTPS with a self-signed
localhost.crt. ignoreHTTPSErrors lets Playwright's browser navigate
the page, but Chrome applies stricter rules to service worker script
fetching: registration of mockServiceWorker.js fails with
'An SSL certificate error occurred when fetching the script'.

Without the MSW service worker, post-login API calls to the BFF
(GetUserActors) fall through to the real port 5001 where the BFF
has crashed (unrelated AzureAppConfiguration issue), and the app
hangs on a blank page.

Pass --ignore-certificate-errors via launchOptions.args so Chrome
trusts the self-signed cert for the service worker script as well. (frontend-specialisten)

  • 27099024: fix(e2e): persist MSAL sessionStorage across tests

storageState only captures cookies + localStorage, but MSAL is
configured with BrowserCacheLocation.SessionStorage
(libs/dh/auth/feature-msal/src/dh-b2c-config.ts:41). Without
sessionStorage replay the main project contexts had no tokens and
the app redirected straight back to /login on every test.

  • auth.setup.ts now serialises sessionStorage to
    apps/dh/e2e-dh/.auth/session.json alongside user.json.
  • fixtures/dh-test.ts provides a context override that injects the
    captured sessionStorage via addInitScript on every new page,
    gated by an authenticated test option.
  • The 'Before login' describe sets authenticated: false next to the
    empty storageState so the unauthenticated flow stays intact. (frontend-specialisten)
  • 7ea308a5: fix(e2e): hydrate sessionStorage once via page.evaluate, speed up CI

The previous addInitScript approach re-injected MSAL tokens on every
navigation, so even after a logout MSAL's cleared sessionStorage was
immediately re-seeded and the app treated the user as authenticated.

Switch to page.evaluate after a single goto('/') inside the page
fixture. The seed happens once per test; subsequent navigations rely
on the browser's normal sessionStorage persistence, and a real logout
can actually clear the session.

Also temporarily disable lint, license, format, watt-bump, QA-fix
commit, and the test/build/package nx run so we iterate faster on
the e2e flow. These MUST be re-enabled before merge. (frontend-specialisten)

  • 0bb8cf6e: fix(e2e): handle MSAL race in setup and Watt modal close button

Three issues from the previous CI run:

  1. auth.setup.ts could read sessionStorage before MSAL had finished
    writing its keys, racing with a token-refresh navigation and
    throwing 'Execution context was destroyed'. Now poll until at
    least one msal.* key exists before serialising.

  2. WattModal puts the close button's aria-label on the
    wrapper, not the inner native . Role queries with
    name=/close/i never matched, so the click timed out. Press Escape
    instead, since Watt modals close on Escape by default.

  3. The 'Fremsoeg forretningsbeskeder' heading occasionally needs more
    than the default 6s expect timeout to render after first sign-in
    on a cold MSW worker; bump to 15s for the language-selection spec
    where this manifested. (frontend-specialisten)

  • ffb0b28a: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • cca0e03c: fix(api-dh): upgrade transitive OpenTelemetry packages to 1.15.3

Three GHSAs were published against OpenTelemetry.Api 1.8.1 / 1.14.0
and OpenTelemetry.Exporter.OpenTelemetryProtocol 1.14.0 after main
was last built green. With TreatWarningsAsErrors=true, NU1902 turns
those advisories into build failures, blocking every new build.

The packages are pulled in transitively via
Azure.Monitor.OpenTelemetry.AspNetCore. Add explicit
PackageReferences in Directory.Build.props at the api-dh source
level (covers both DataHub.WebApi and DataHub.WebApi.Tests) so
NuGet uses the patched 1.15.3 instead of the older transitive
versions.

Patched versions per GitHub advisories:

  • GHSA-g94r-2vxg-569j: OpenTelemetry.Api 1.15.3
  • GHSA-mr8r-92fq-pj8p: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3
  • GHSA-q834-8qmm-v933: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.2 (frontend-specialisten)
  • 53f2b50d: ci: re-enable disabled steps so build artefacts are real

Disabling lint/build/test for faster e2e iteration backfired:
the dev-server compile produced TS errors because graphql-codegen
outputs were not properly invalidated when the e2e task was the
only consumer (cache-hit on dh-shared-domain:generate restored
stale outputs). Tests still appeared green because Vite serves
through TS errors and our specs do not exercise the broken
features.

Restore the original step ordering so a passing CI actually means
a clean build. (frontend-specialisten)

  • 5caf6a44: QA fixes (github-actions[bot])
  • ba1655ef: Revert OpenTelemetry pinning, handled on main (frontend-specialisten)
  • 1b248f28: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • fdf91528: fix(e2e): let nxE2EPreset own reporter and parallelism config

The preset already configures fullyParallel: true, retries: 2 (CI),
and an html + (CI-only) blob reporter pair with output paths under
dist/.playwright//. Those paths are declared outputs of
the e2e target, so Nx Cloud syncs them from distributed agents to
the orchestrator where the pr.yml merge-reports step runs.

The previous custom reporter override placed blob-report/ and
playwright-report/ in the project CWD (apps/dh/e2e-dh/), outside
the declared output tree. In a sharded run those would never reach
the orchestrator, leaving the merge step with nothing to merge.

Drop the duplicate fullyParallel and retries entries while we are
at it; pass openHtmlReport: 'never' to the preset to keep the
no-auto-open behaviour the explicit reporter previously provided.

Verified locally: with CI=true, blob lands at
dist/.playwright/apps/dh/e2e-dh/blob-report/report.zip, html at
dist/.playwright/apps/dh/e2e-dh/playwright-report/index.html, and
'bun playwright merge-reports --reporter html ' produces
a unified report at workspace-root playwright-report/. (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5766

Commits

  • bed036ac: fix(dh): adjustments to fees under charge links (dzhavat)
  • 66469da8: fix(dh): disable input alias lint (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5766

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5765...ui_frontend_5766

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5768

Commits

  • 9e4cce90: fix(dh): add support for brs-037 (dzhavat)
  • 985d56f8: fix(dh): fix translation (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5744

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5765...ui_frontend_5744

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5744

Commits

  • af6a8819: fix(dh): do not reload app second time after first login (dzhavat)
  • 3a0731a9: QA fixes (github-actions[bot])
  • 5ad8aadf: chore(dh): delete weird file (dzhavat)
  • 118a736d: QA fixes (github-actions[bot])
  • b47c702f: chore: delete weird file (dzhavat)
  • cb42c4f7: QA fixes (github-actions[bot])
  • 6b0ec9e6: Merge branch 'main' into fix-348 (web-flow)
  • ec3bfeb1: chore: remove file (dzhavat)
  • 55a94a01: Merge branch 'main' into fix-348 (web-flow)
  • a3ef7fa1: Merge branch 'main' into fix-348 (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5744

Commits

  • af6a8819: fix(dh): do not reload app second time after first login (dzhavat)
  • 3a0731a9: QA fixes (github-actions[bot])
  • 5ad8aadf: chore(dh): delete weird file (dzhavat)
  • 118a736d: QA fixes (github-actions[bot])
  • b47c702f: chore: delete weird file (dzhavat)
  • cb42c4f7: QA fixes (github-actions[bot])
  • 6b0ec9e6: Merge branch 'main' into fix-348 (web-flow)
  • ec3bfeb1: chore: remove file (dzhavat)
  • 55a94a01: Merge branch 'main' into fix-348 (web-flow)
  • a3ef7fa1: Merge branch 'main' into fix-348 (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5766

Commits

  • bed036ac: fix(dh): adjustments to fees under charge links (dzhavat)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5729

Commits

  • ae760f44: Initial plan for Cypress to Playwright migration

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • e531368b: Rewrite e2e tests from Cypress to Playwright

  • Add @nx/playwright and @playwright/test as dependencies

  • Create playwright.config.ts and playwright-acceptance-tests.config.ts

  • Rewrite all e2e test files (.cy.ts → .spec.ts)

  • Update project.json with Playwright targets

  • Update nx.json to use @nx/playwright/plugin

  • Update CI workflow (pr.yml) for Playwright

  • Remove Cypress dependencies, configs, and support files

  • Remove wholesale Cypress component test files

  • Update documentation and .gitignore

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • c234b806: Remove package-lock.json (project uses bun.lock)

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 9240bdd2: Update bun.lock for Cypress to Playwright migration

  • Add @nx/playwright@22.6.3 and @playwright/test@1.59.1

  • Update playwright to 1.59.1 and playwright-core to 1.59.1

  • Remove direct Cypress dependencies (cypress, @bahmutov/cypress-esbuild-preprocessor,
    @cypress/webpack-dev-server, @testing-library/cypress, eslint-plugin-cypress)

  • Retain @nx/cypress as transitive dependency of @nx/storybook

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f2e67eab-e855-4d06-bc92-17a29b659e5a

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 7eb5a386: chore: bump bun.lock file (dzhavat)
  • 270f6006: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 80e1cb8c: QA fixes (github-actions[bot])
  • 8a8fc4f2: Add cookie consent and B2C login helpers for Playwright e2e tests

Create dh-test.ts with Playwright fixtures that provide:

  • removeCookieBanner: sets CookieInformationConsent cookie to dismiss the banner
  • login: performs B2C authentication via DH_E2E_USERNAME/DH_E2E_PASSWORD env vars

Update app-shell, language-selection, and redirect-to-initial-url tests
to use the new fixtures with beforeEach hooks, matching the original
Cypress test behavior.

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 8db0e683: Remove unused baseURL variable in dh-test.ts

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 2dd54096: ci: install Playwright browsers on Nx Cloud agents

The e2e target is distributed via --distribute-on='3 linux-large', so
browsers must be on the agents, not on the orchestrator. The install
step in pr.yml ran only on the main runner, leaving agents without
a browser and failing with 'Executable doesn't exist' at the agent
cache path. (frontend-specialisten)

  • a766ac89: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright

Co-authored-by: frontend-specialisten 86852536+frontend-specialisten@users.noreply.github.com (web-flow)

  • 38327501: QA fixes (github-actions[bot])

  • 3801b098: chore(e2e): address review feedback on Playwright migration

  • Move dh-test.ts to src/fixtures/ per Playwright best-practices layout

  • Replace CSS selectors with semantic locators (getByRole with name filter
    verified against dev003, getByTestId on selected market participant)

  • Add data-testid='selectedMarketParticipant' on the clickable container

  • Harden playwright configs: fullyParallel: true, CI retries, blob+html
    reporter in CI, video: retain-on-failure

  • Project target uses 'bun playwright test' over 'bunx'

  • Replace every bunx with bun (local binary only, no network fallback)

  • Fix GitHub Actions input injection in is-affected composite action
    (move inputs to env block, use process.env.PROJECT in node -e)

  • Drop dead DH_E2E_B2C_URL env var and redundant orchestrator-side
    Playwright install; add best-effort merge-reports step

  • Normalize dashes in docs/dh/testing.md (frontend-specialisten)

  • b0e5b422: ci: move nx start-ci-run after bun install

bun nx requires the binary in node_modules/.bin/ (it does not
fall back to the npm registry like bunx would). Running start-ci-run
before the install step left nx unresolved and killed the orchestrator
job immediately. Reordering keeps Nx Cloud DTE bootstrap working without
needing bunx. (frontend-specialisten)

  • 61116777: QA fixes (github-actions[bot])
  • 15fc12f3: feat(e2e): authenticate via storageState setup project

Mirror the cy.session caching pattern by doing UI login once in a
setup project and saving the authenticated browser context to
apps/dh/e2e-dh/.auth/user.json. The main chromium project then
loads that storageState and depends on setup.

  • Add apps/dh/e2e-dh/src/e2e/auth.setup.ts using semantic locators
    on both the app login button and the B2C form (getByLabel on
    Mailadresse/Adgangskode, getByRole for Log på)
  • Treat the authenticated shell (profileMenu testid) as the
    success marker so the setup does not hardcode default routes
  • Gitignore the generated .auth/ directory
  • Delete the dh-test.ts fixture; specs import from @playwright/test
  • Remove test.skip() from all four specs
  • Use test.use({ storageState: { cookies: [], origins: [] } })
    for the one test that requires an unauthenticated context
  • Close the auto-opening 'New search' dialog on /message-archive
    before interacting with elements behind its backdrop
  • Switch menu interactions to semantic getByRole('menuitem', ...) (frontend-specialisten)
  • 7c76d442: fix(e2e): use role-scoped locators for B2C form and pin Danish locale

Root cause: getByLabel(/mailadresse|email/i) matched both the
B2C form's aria-label and the email input's aria-label, tripping
strict mode. Scope to textbox role so only inputs are considered.

Playwright's default browser locale is en-US, which caused B2C to
render in English on CI while the app renders in Danish. Pin
use.locale to da-DK so both sides are consistent with the existing
Danish heading assertions in the specs. (frontend-specialisten)

  • 2da30c9e: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 477692a5: QA fixes (github-actions[bot])
  • 54409b8e: fix(e2e): accept self-signed cert for service worker registration

The app-dh:serve:mocked dev server runs over HTTPS with a self-signed
localhost.crt. ignoreHTTPSErrors lets Playwright's browser navigate
the page, but Chrome applies stricter rules to service worker script
fetching: registration of mockServiceWorker.js fails with
'An SSL certificate error occurred when fetching the script'.

Without the MSW service worker, post-login API calls to the BFF
(GetUserActors) fall through to the real port 5001 where the BFF
has crashed (unrelated AzureAppConfiguration issue), and the app
hangs on a blank page.

Pass --ignore-certificate-errors via launchOptions.args so Chrome
trusts the self-signed cert for the service worker script as well. (frontend-specialisten)

  • 27099024: fix(e2e): persist MSAL sessionStorage across tests

storageState only captures cookies + localStorage, but MSAL is
configured with BrowserCacheLocation.SessionStorage
(libs/dh/auth/feature-msal/src/dh-b2c-config.ts:41). Without
sessionStorage replay the main project contexts had no tokens and
the app redirected straight back to /login on every test.

  • auth.setup.ts now serialises sessionStorage to
    apps/dh/e2e-dh/.auth/session.json alongside user.json.
  • fixtures/dh-test.ts provides a context override that injects the
    captured sessionStorage via addInitScript on every new page,
    gated by an authenticated test option.
  • The 'Before login' describe sets authenticated: false next to the
    empty storageState so the unauthenticated flow stays intact. (frontend-specialisten)
  • 7ea308a5: fix(e2e): hydrate sessionStorage once via page.evaluate, speed up CI

The previous addInitScript approach re-injected MSAL tokens on every
navigation, so even after a logout MSAL's cleared sessionStorage was
immediately re-seeded and the app treated the user as authenticated.

Switch to page.evaluate after a single goto('/') inside the page
fixture. The seed happens once per test; subsequent navigations rely
on the browser's normal sessionStorage persistence, and a real logout
can actually clear the session.

Also temporarily disable lint, license, format, watt-bump, QA-fix
commit, and the test/build/package nx run so we iterate faster on
the e2e flow. These MUST be re-enabled before merge. (frontend-specialisten)

  • 0bb8cf6e: fix(e2e): handle MSAL race in setup and Watt modal close button

Three issues from the previous CI run:

  1. auth.setup.ts could read sessionStorage before MSAL had finished
    writing its keys, racing with a token-refresh navigation and
    throwing 'Execution context was destroyed'. Now poll until at
    least one msal.* key exists before serialising.

  2. WattModal puts the close button's aria-label on the
    wrapper, not the inner native . Role queries with
    name=/close/i never matched, so the click timed out. Press Escape
    instead, since Watt modals close on Escape by default.

  3. The 'Fremsoeg forretningsbeskeder' heading occasionally needs more
    than the default 6s expect timeout to render after first sign-in
    on a cold MSW worker; bump to 15s for the language-selection spec
    where this manifested. (frontend-specialisten)

  • ffb0b28a: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • cca0e03c: fix(api-dh): upgrade transitive OpenTelemetry packages to 1.15.3

Three GHSAs were published against OpenTelemetry.Api 1.8.1 / 1.14.0
and OpenTelemetry.Exporter.OpenTelemetryProtocol 1.14.0 after main
was last built green. With TreatWarningsAsErrors=true, NU1902 turns
those advisories into build failures, blocking every new build.

The packages are pulled in transitively via
Azure.Monitor.OpenTelemetry.AspNetCore. Add explicit
PackageReferences in Directory.Build.props at the api-dh source
level (covers both DataHub.WebApi and DataHub.WebApi.Tests) so
NuGet uses the patched 1.15.3 instead of the older transitive
versions.

Patched versions per GitHub advisories:

  • GHSA-g94r-2vxg-569j: OpenTelemetry.Api 1.15.3
  • GHSA-mr8r-92fq-pj8p: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3
  • GHSA-q834-8qmm-v933: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.2 (frontend-specialisten)
  • 53f2b50d: ci: re-enable disabled steps so build artefacts are real

Disabling lint/build/test for faster e2e iteration backfired:
the dev-server compile produced TS errors because graphql-codegen
outputs were not properly invalidated when the e2e task was the
only consumer (cache-hit on dh-shared-domain:generate restored
stale outputs). Tests still appeared green because Vite serves
through TS errors and our specs do not exercise the broken
features.

Restore the original step ordering so a passing CI actually means
a clean build. (frontend-specialisten)

  • 5caf6a44: QA fixes (github-actions[bot])
  • ba1655ef: Revert OpenTelemetry pinning, handled on main (frontend-specialisten)
  • 1b248f28: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • fdf91528: fix(e2e): let nxE2EPreset own reporter and parallelism config

The preset already configures fullyParallel: true, retries: 2 (CI),
and an html + (CI-only) blob reporter pair with output paths under
dist/.playwright//. Those paths are declared outputs of
the e2e target, so Nx Cloud syncs them from distributed agents to
the orchestrator where the pr.yml merge-reports step runs.

The previous custom reporter override placed blob-report/ and
playwright-report/ in the project CWD (apps/dh/e2e-dh/), outside
the declared output tree. In a sharded run those would never reach
the orchestrator, leaving the merge step with nothing to merge.

Drop the duplicate fullyParallel and retries entries while we are
at it; pass openHtmlReport: 'never' to the preset to keep the
no-auto-open behaviour the explicit reporter previously provided.

Verified locally: with CI=true, blob lands at
dist/.playwright/apps/dh/e2e-dh/blob-report/report.zip, html at
dist/.playwright/apps/dh/e2e-dh/playwright-report/index.html, and
'bun playwright merge-reports --reporter html ' produces
a unified report at workspace-root playwright-report/. (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5765

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5759...ui_frontend_5765

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5765

Commits

  • 53853043: Add tasks.json (ManBearTM)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5729

Commits

  • ae760f44: Initial plan for Cypress to Playwright migration

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • e531368b: Rewrite e2e tests from Cypress to Playwright

  • Add @nx/playwright and @playwright/test as dependencies

  • Create playwright.config.ts and playwright-acceptance-tests.config.ts

  • Rewrite all e2e test files (.cy.ts → .spec.ts)

  • Update project.json with Playwright targets

  • Update nx.json to use @nx/playwright/plugin

  • Update CI workflow (pr.yml) for Playwright

  • Remove Cypress dependencies, configs, and support files

  • Remove wholesale Cypress component test files

  • Update documentation and .gitignore

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • c234b806: Remove package-lock.json (project uses bun.lock)

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 9240bdd2: Update bun.lock for Cypress to Playwright migration

  • Add @nx/playwright@22.6.3 and @playwright/test@1.59.1

  • Update playwright to 1.59.1 and playwright-core to 1.59.1

  • Remove direct Cypress dependencies (cypress, @bahmutov/cypress-esbuild-preprocessor,
    @cypress/webpack-dev-server, @testing-library/cypress, eslint-plugin-cypress)

  • Retain @nx/cypress as transitive dependency of @nx/storybook

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f2e67eab-e855-4d06-bc92-17a29b659e5a

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 7eb5a386: chore: bump bun.lock file (dzhavat)
  • 270f6006: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 80e1cb8c: QA fixes (github-actions[bot])
  • 8a8fc4f2: Add cookie consent and B2C login helpers for Playwright e2e tests

Create dh-test.ts with Playwright fixtures that provide:

  • removeCookieBanner: sets CookieInformationConsent cookie to dismiss the banner
  • login: performs B2C authentication via DH_E2E_USERNAME/DH_E2E_PASSWORD env vars

Update app-shell, language-selection, and redirect-to-initial-url tests
to use the new fixtures with beforeEach hooks, matching the original
Cypress test behavior.

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 8db0e683: Remove unused baseURL variable in dh-test.ts

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 2dd54096: ci: install Playwright browsers on Nx Cloud agents

The e2e target is distributed via --distribute-on='3 linux-large', so
browsers must be on the agents, not on the orchestrator. The install
step in pr.yml ran only on the main runner, leaving agents without
a browser and failing with 'Executable doesn't exist' at the agent
cache path. (frontend-specialisten)

  • a766ac89: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright

Co-authored-by: frontend-specialisten 86852536+frontend-specialisten@users.noreply.github.com (web-flow)

  • 38327501: QA fixes (github-actions[bot])

  • 3801b098: chore(e2e): address review feedback on Playwright migration

  • Move dh-test.ts to src/fixtures/ per Playwright best-practices layout

  • Replace CSS selectors with semantic locators (getByRole with name filter
    verified against dev003, getByTestId on selected market participant)

  • Add data-testid='selectedMarketParticipant' on the clickable container

  • Harden playwright configs: fullyParallel: true, CI retries, blob+html
    reporter in CI, video: retain-on-failure

  • Project target uses 'bun playwright test' over 'bunx'

  • Replace every bunx with bun (local binary only, no network fallback)

  • Fix GitHub Actions input injection in is-affected composite action
    (move inputs to env block, use process.env.PROJECT in node -e)

  • Drop dead DH_E2E_B2C_URL env var and redundant orchestrator-side
    Playwright install; add best-effort merge-reports step

  • Normalize dashes in docs/dh/testing.md (frontend-specialisten)

  • b0e5b422: ci: move nx start-ci-run after bun install

bun nx requires the binary in node_modules/.bin/ (it does not
fall back to the npm registry like bunx would). Running start-ci-run
before the install step left nx unresolved and killed the orchestrator
job immediately. Reordering keeps Nx Cloud DTE bootstrap working without
needing bunx. (frontend-specialisten)

  • 61116777: QA fixes (github-actions[bot])
  • 15fc12f3: feat(e2e): authenticate via storageState setup project

Mirror the cy.session caching pattern by doing UI login once in a
setup project and saving the authenticated browser context to
apps/dh/e2e-dh/.auth/user.json. The main chromium project then
loads that storageState and depends on setup.

  • Add apps/dh/e2e-dh/src/e2e/auth.setup.ts using semantic locators
    on both the app login button and the B2C form (getByLabel on
    Mailadresse/Adgangskode, getByRole for Log på)
  • Treat the authenticated shell (profileMenu testid) as the
    success marker so the setup does not hardcode default routes
  • Gitignore the generated .auth/ directory
  • Delete the dh-test.ts fixture; specs import from @playwright/test
  • Remove test.skip() from all four specs
  • Use test.use({ storageState: { cookies: [], origins: [] } })
    for the one test that requires an unauthenticated context
  • Close the auto-opening 'New search' dialog on /message-archive
    before interacting with elements behind its backdrop
  • Switch menu interactions to semantic getByRole('menuitem', ...) (frontend-specialisten)
  • 7c76d442: fix(e2e): use role-scoped locators for B2C form and pin Danish locale

Root cause: getByLabel(/mailadresse|email/i) matched both the
B2C form's aria-label and the email input's aria-label, tripping
strict mode. Scope to textbox role so only inputs are considered.

Playwright's default browser locale is en-US, which caused B2C to
render in English on CI while the app renders in Danish. Pin
use.locale to da-DK so both sides are consistent with the existing
Danish heading assertions in the specs. (frontend-specialisten)

  • 2da30c9e: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 477692a5: QA fixes (github-actions[bot])
  • 54409b8e: fix(e2e): accept self-signed cert for service worker registration

The app-dh:serve:mocked dev server runs over HTTPS with a self-signed
localhost.crt. ignoreHTTPSErrors lets Playwright's browser navigate
the page, but Chrome applies stricter rules to service worker script
fetching: registration of mockServiceWorker.js fails with
'An SSL certificate error occurred when fetching the script'.

Without the MSW service worker, post-login API calls to the BFF
(GetUserActors) fall through to the real port 5001 where the BFF
has crashed (unrelated AzureAppConfiguration issue), and the app
hangs on a blank page.

Pass --ignore-certificate-errors via launchOptions.args so Chrome
trusts the self-signed cert for the service worker script as well. (frontend-specialisten)

  • 27099024: fix(e2e): persist MSAL sessionStorage across tests

storageState only captures cookies + localStorage, but MSAL is
configured with BrowserCacheLocation.SessionStorage
(libs/dh/auth/feature-msal/src/dh-b2c-config.ts:41). Without
sessionStorage replay the main project contexts had no tokens and
the app redirected straight back to /login on every test.

  • auth.setup.ts now serialises sessionStorage to
    apps/dh/e2e-dh/.auth/session.json alongside user.json.
  • fixtures/dh-test.ts provides a context override that injects the
    captured sessionStorage via addInitScript on every new page,
    gated by an authenticated test option.
  • The 'Before login' describe sets authenticated: false next to the
    empty storageState so the unauthenticated flow stays intact. (frontend-specialisten)
  • 7ea308a5: fix(e2e): hydrate sessionStorage once via page.evaluate, speed up CI

The previous addInitScript approach re-injected MSAL tokens on every
navigation, so even after a logout MSAL's cleared sessionStorage was
immediately re-seeded and the app treated the user as authenticated.

Switch to page.evaluate after a single goto('/') inside the page
fixture. The seed happens once per test; subsequent navigations rely
on the browser's normal sessionStorage persistence, and a real logout
can actually clear the session.

Also temporarily disable lint, license, format, watt-bump, QA-fix
commit, and the test/build/package nx run so we iterate faster on
the e2e flow. These MUST be re-enabled before merge. (frontend-specialisten)

  • 0bb8cf6e: fix(e2e): handle MSAL race in setup and Watt modal close button

Three issues from the previous CI run:

  1. auth.setup.ts could read sessionStorage before MSAL had finished
    writing its keys, racing with a token-refresh navigation and
    throwing 'Execution context was destroyed'. Now poll until at
    least one msal.* key exists before serialising.

  2. WattModal puts the close button's aria-label on the
    wrapper, not the inner native . Role queries with
    name=/close/i never matched, so the click timed out. Press Escape
    instead, since Watt modals close on Escape by default.

  3. The 'Fremsoeg forretningsbeskeder' heading occasionally needs more
    than the default 6s expect timeout to render after first sign-in
    on a cold MSW worker; bump to 15s for the language-selection spec
    where this manifested. (frontend-specialisten)

  • ffb0b28a: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • cca0e03c: fix(api-dh): upgrade transitive OpenTelemetry packages to 1.15.3

Three GHSAs were published against OpenTelemetry.Api 1.8.1 / 1.14.0
and OpenTelemetry.Exporter.OpenTelemetryProtocol 1.14.0 after main
was last built green. With TreatWarningsAsErrors=true, NU1902 turns
those advisories into build failures, blocking every new build.

The packages are pulled in transitively via
Azure.Monitor.OpenTelemetry.AspNetCore. Add explicit
PackageReferences in Directory.Build.props at the api-dh source
level (covers both DataHub.WebApi and DataHub.WebApi.Tests) so
NuGet uses the patched 1.15.3 instead of the older transitive
versions.

Patched versions per GitHub advisories:

  • GHSA-g94r-2vxg-569j: OpenTelemetry.Api 1.15.3
  • GHSA-mr8r-92fq-pj8p: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3
  • GHSA-q834-8qmm-v933: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.2 (frontend-specialisten)
  • 53f2b50d: ci: re-enable disabled steps so build artefacts are real

Disabling lint/build/test for faster e2e iteration backfired:
the dev-server compile produced TS errors because graphql-codegen
outputs were not properly invalidated when the e2e task was the
only consumer (cache-hit on dh-shared-domain:generate restored
stale outputs). Tests still appeared green because Vite serves
through TS errors and our specs do not exercise the broken
features.

Restore the original step ordering so a passing CI actually means
a clean build. (frontend-specialisten)

  • 5caf6a44: QA fixes (github-actions[bot])
  • ba1655ef: Revert OpenTelemetry pinning, handled on main (frontend-specialisten)
  • 1b248f28: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • fdf91528: fix(e2e): let nxE2EPreset own reporter and parallelism config

The preset already configures fullyParallel: true, retries: 2 (CI),
and an html + (CI-only) blob reporter pair with output paths under
dist/.playwright//. Those paths are declared outputs of
the e2e target, so Nx Cloud syncs them from distributed agents to
the orchestrator where the pr.yml merge-reports step runs.

The previous custom reporter override placed blob-report/ and
playwright-report/ in the project CWD (apps/dh/e2e-dh/), outside
the declared output tree. In a sharded run those would never reach
the orchestrator, leaving the merge step with nothing to merge.

Drop the duplicate fullyParallel and retries entries while we are
at it; pass openHtmlReport: 'never' to the preset to keep the
no-auto-open behaviour the explicit reporter previously provided.

Verified locally: with CI=true, blob lands at
dist/.playwright/apps/dh/e2e-dh/blob-report/report.zip, html at
dist/.playwright/apps/dh/e2e-dh/playwright-report/index.html, and
'bun playwright merge-reports --reporter html ' produces
a unified report at workspace-root playwright-report/. (frontend-specialisten)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5759

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5754...ui_frontend_5759

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5759

Commits

  • d498d678: Try custom schema formatter (ManBearTM)
  • 85c4fed0: QA fixes (github-actions[bot])
  • 2999ab1b: Minor refac (ManBearTM)
  • 2ae9c615: Remove snapshot tests (ManBearTM)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5764

Commits

  • 552b4d6e: chore(deps): bump postcss from 8.5.6 to 8.5.12 in /apps/dh/e2e-dh

Bumps postcss from 8.5.6 to 8.5.12.


updated-dependencies:

  • dependency-name: postcss
    dependency-version: 8.5.12
    dependency-type: indirect
    ...

Signed-off-by: dependabot[bot] support@github.com (web-flow)

  • b99e61ed: Merge branch 'main' into dependabot/npm_and_yarn/apps/dh/e2e-dh/postcss-8.5.12 (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5754

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5763...ui_frontend_5754

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5754

Commits

  • 4e477357: style: removes the sticky header (Sejruppen)
  • 2bfe8678: chore: change translation (Sejruppen)
  • 6c12fe1b: feat: adds clearing of address (Sejruppen)
  • 8638d3a5: feat: disables clear on same (Sejruppen)
  • c80d6dfe: chore: changes button variant (Sejruppen)
  • e54896c2: QA fixes (github-actions[bot])
  • 16f06ecf: chore: revert schema (Sejruppen)
  • 259b27fc: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)
  • 410787dd: chore: removes file (Sejruppen)
  • 6718e74d: QA fixes (github-actions[bot])
  • 389db9f1: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)
  • a2d67cb5: QA fixes (github-actions[bot])
  • 23d9b3d3: chore: changes size (Sejruppen)
  • fac5d60d: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)
  • 7dc6f739: feat: Adds new size input for toggle (Sejruppen)
  • a82d1bb4: style: adds small size (Sejruppen)
  • 8d961ba2: style: adds small size (Sejruppen)
  • a32b735b: chore: adds helper for clearing and tests (Sejruppen)
  • 7dcfdf55: Merge branch 'main' into customer-data/design (Sejruppen)
  • 0c029536: chore: bump watt version (Sejruppen)
  • dae60deb: QA fixes (github-actions[bot])
  • c24ceb7d: chore: remove file (Sejruppen)
  • e507ec1c: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)
  • 77d2b269: Merge remote-tracking branch 'origin/main' into customer-data/design

Conflicts:

libs/watt/package/package.json (Sejruppen)

  • 8ec4835a: Merge branch 'main' into customer-data/design (Sejruppen)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5729

Commits

  • ae760f44: Initial plan for Cypress to Playwright migration

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • e531368b: Rewrite e2e tests from Cypress to Playwright

  • Add @nx/playwright and @playwright/test as dependencies

  • Create playwright.config.ts and playwright-acceptance-tests.config.ts

  • Rewrite all e2e test files (.cy.ts → .spec.ts)

  • Update project.json with Playwright targets

  • Update nx.json to use @nx/playwright/plugin

  • Update CI workflow (pr.yml) for Playwright

  • Remove Cypress dependencies, configs, and support files

  • Remove wholesale Cypress component test files

  • Update documentation and .gitignore

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • c234b806: Remove package-lock.json (project uses bun.lock)

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/2bc102c6-7781-41f9-ba09-bc4324589979

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 9240bdd2: Update bun.lock for Cypress to Playwright migration

  • Add @nx/playwright@22.6.3 and @playwright/test@1.59.1

  • Update playwright to 1.59.1 and playwright-core to 1.59.1

  • Remove direct Cypress dependencies (cypress, @bahmutov/cypress-esbuild-preprocessor,
    @cypress/webpack-dev-server, @testing-library/cypress, eslint-plugin-cypress)

  • Retain @nx/cypress as transitive dependency of @nx/storybook

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f2e67eab-e855-4d06-bc92-17a29b659e5a

Co-authored-by: dzhavat 1096332+dzhavat@users.noreply.github.com (web-flow)

  • 7eb5a386: chore: bump bun.lock file (dzhavat)
  • 270f6006: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 80e1cb8c: QA fixes (github-actions[bot])
  • 8a8fc4f2: Add cookie consent and B2C login helpers for Playwright e2e tests

Create dh-test.ts with Playwright fixtures that provide:

  • removeCookieBanner: sets CookieInformationConsent cookie to dismiss the banner
  • login: performs B2C authentication via DH_E2E_USERNAME/DH_E2E_PASSWORD env vars

Update app-shell, language-selection, and redirect-to-initial-url tests
to use the new fixtures with beforeEach hooks, matching the original
Cypress test behavior.

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 8db0e683: Remove unused baseURL variable in dh-test.ts

Agent-Logs-Url: https://github.com/Energinet-DataHub/greenforce-frontend/sessions/f53fe774-eb55-46a1-abe5-f15886a40de4 (web-flow)

  • 2dd54096: ci: install Playwright browsers on Nx Cloud agents

The e2e target is distributed via --distribute-on='3 linux-large', so
browsers must be on the agents, not on the orchestrator. The install
step in pr.yml ran only on the main runner, leaving agents without
a browser and failing with 'Executable doesn't exist' at the agent
cache path. (frontend-specialisten)

  • a766ac89: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright

Co-authored-by: frontend-specialisten 86852536+frontend-specialisten@users.noreply.github.com (web-flow)

  • 38327501: QA fixes (github-actions[bot])

  • 3801b098: chore(e2e): address review feedback on Playwright migration

  • Move dh-test.ts to src/fixtures/ per Playwright best-practices layout

  • Replace CSS selectors with semantic locators (getByRole with name filter
    verified against dev003, getByTestId on selected market participant)

  • Add data-testid='selectedMarketParticipant' on the clickable container

  • Harden playwright configs: fullyParallel: true, CI retries, blob+html
    reporter in CI, video: retain-on-failure

  • Project target uses 'bun playwright test' over 'bunx'

  • Replace every bunx with bun (local binary only, no network fallback)

  • Fix GitHub Actions input injection in is-affected composite action
    (move inputs to env block, use process.env.PROJECT in node -e)

  • Drop dead DH_E2E_B2C_URL env var and redundant orchestrator-side
    Playwright install; add best-effort merge-reports step

  • Normalize dashes in docs/dh/testing.md (frontend-specialisten)

  • b0e5b422: ci: move nx start-ci-run after bun install

bun nx requires the binary in node_modules/.bin/ (it does not
fall back to the npm registry like bunx would). Running start-ci-run
before the install step left nx unresolved and killed the orchestrator
job immediately. Reordering keeps Nx Cloud DTE bootstrap working without
needing bunx. (frontend-specialisten)

  • 61116777: QA fixes (github-actions[bot])
  • 15fc12f3: feat(e2e): authenticate via storageState setup project

Mirror the cy.session caching pattern by doing UI login once in a
setup project and saving the authenticated browser context to
apps/dh/e2e-dh/.auth/user.json. The main chromium project then
loads that storageState and depends on setup.

  • Add apps/dh/e2e-dh/src/e2e/auth.setup.ts using semantic locators
    on both the app login button and the B2C form (getByLabel on
    Mailadresse/Adgangskode, getByRole for Log på)
  • Treat the authenticated shell (profileMenu testid) as the
    success marker so the setup does not hardcode default routes
  • Gitignore the generated .auth/ directory
  • Delete the dh-test.ts fixture; specs import from @playwright/test
  • Remove test.skip() from all four specs
  • Use test.use({ storageState: { cookies: [], origins: [] } })
    for the one test that requires an unauthenticated context
  • Close the auto-opening 'New search' dialog on /message-archive
    before interacting with elements behind its backdrop
  • Switch menu interactions to semantic getByRole('menuitem', ...) (frontend-specialisten)
  • 7c76d442: fix(e2e): use role-scoped locators for B2C form and pin Danish locale

Root cause: getByLabel(/mailadresse|email/i) matched both the
B2C form's aria-label and the email input's aria-label, tripping
strict mode. Scope to textbox role so only inputs are considered.

Playwright's default browser locale is en-US, which caused B2C to
render in English on CI while the app renders in Danish. Pin
use.locale to da-DK so both sides are consistent with the existing
Danish heading assertions in the specs. (frontend-specialisten)

  • 2da30c9e: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • 477692a5: QA fixes (github-actions[bot])
  • 54409b8e: fix(e2e): accept self-signed cert for service worker registration

The app-dh:serve:mocked dev server runs over HTTPS with a self-signed
localhost.crt. ignoreHTTPSErrors lets Playwright's browser navigate
the page, but Chrome applies stricter rules to service worker script
fetching: registration of mockServiceWorker.js fails with
'An SSL certificate error occurred when fetching the script'.

Without the MSW service worker, post-login API calls to the BFF
(GetUserActors) fall through to the real port 5001 where the BFF
has crashed (unrelated AzureAppConfiguration issue), and the app
hangs on a blank page.

Pass --ignore-certificate-errors via launchOptions.args so Chrome
trusts the self-signed cert for the service worker script as well. (frontend-specialisten)

  • 27099024: fix(e2e): persist MSAL sessionStorage across tests

storageState only captures cookies + localStorage, but MSAL is
configured with BrowserCacheLocation.SessionStorage
(libs/dh/auth/feature-msal/src/dh-b2c-config.ts:41). Without
sessionStorage replay the main project contexts had no tokens and
the app redirected straight back to /login on every test.

  • auth.setup.ts now serialises sessionStorage to
    apps/dh/e2e-dh/.auth/session.json alongside user.json.
  • fixtures/dh-test.ts provides a context override that injects the
    captured sessionStorage via addInitScript on every new page,
    gated by an authenticated test option.
  • The 'Before login' describe sets authenticated: false next to the
    empty storageState so the unauthenticated flow stays intact. (frontend-specialisten)
  • 7ea308a5: fix(e2e): hydrate sessionStorage once via page.evaluate, speed up CI

The previous addInitScript approach re-injected MSAL tokens on every
navigation, so even after a logout MSAL's cleared sessionStorage was
immediately re-seeded and the app treated the user as authenticated.

Switch to page.evaluate after a single goto('/') inside the page
fixture. The seed happens once per test; subsequent navigations rely
on the browser's normal sessionStorage persistence, and a real logout
can actually clear the session.

Also temporarily disable lint, license, format, watt-bump, QA-fix
commit, and the test/build/package nx run so we iterate faster on
the e2e flow. These MUST be re-enabled before merge. (frontend-specialisten)

  • 0bb8cf6e: fix(e2e): handle MSAL race in setup and Watt modal close button

Three issues from the previous CI run:

  1. auth.setup.ts could read sessionStorage before MSAL had finished
    writing its keys, racing with a token-refresh navigation and
    throwing 'Execution context was destroyed'. Now poll until at
    least one msal.* key exists before serialising.

  2. WattModal puts the close button's aria-label on the
    wrapper, not the inner native . Role queries with
    name=/close/i never matched, so the click timed out. Press Escape
    instead, since Watt modals close on Escape by default.

  3. The 'Fremsoeg forretningsbeskeder' heading occasionally needs more
    than the default 6s expect timeout to render after first sign-in
    on a cold MSW worker; bump to 15s for the language-selection spec
    where this manifested. (frontend-specialisten)

  • ffb0b28a: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)
  • cca0e03c: fix(api-dh): upgrade transitive OpenTelemetry packages to 1.15.3

Three GHSAs were published against OpenTelemetry.Api 1.8.1 / 1.14.0
and OpenTelemetry.Exporter.OpenTelemetryProtocol 1.14.0 after main
was last built green. With TreatWarningsAsErrors=true, NU1902 turns
those advisories into build failures, blocking every new build.

The packages are pulled in transitively via
Azure.Monitor.OpenTelemetry.AspNetCore. Add explicit
PackageReferences in Directory.Build.props at the api-dh source
level (covers both DataHub.WebApi and DataHub.WebApi.Tests) so
NuGet uses the patched 1.15.3 instead of the older transitive
versions.

Patched versions per GitHub advisories:

  • GHSA-g94r-2vxg-569j: OpenTelemetry.Api 1.15.3
  • GHSA-mr8r-92fq-pj8p: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3
  • GHSA-q834-8qmm-v933: OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.2 (frontend-specialisten)
  • 53f2b50d: ci: re-enable disabled steps so build artefacts are real

Disabling lint/build/test for faster e2e iteration backfired:
the dev-server compile produced TS errors because graphql-codegen
outputs were not properly invalidated when the e2e task was the
only consumer (cache-hit on dh-shared-domain:generate restored
stale outputs). Tests still appeared green because Vite serves
through TS errors and our specs do not exercise the broken
features.

Restore the original step ordering so a passing CI actually means
a clean build. (frontend-specialisten)

  • 5caf6a44: QA fixes (github-actions[bot])
  • ba1655ef: Revert OpenTelemetry pinning, handled on main (frontend-specialisten)
  • 1b248f28: Merge branch 'main' into copilot/rewrite-e2e-tests-cypress-playwright (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5763

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5762...ui_frontend_5763

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5763

Commits

  • e809aa4c: Pin OpenTelemetry to non-vulnerable version (ManBearTM)
  • 04363d7b: Also pin OpenTelemetry.Exporter (ManBearTM)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5762

What's Changed

New Contributors

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5760...ui_frontend_5762

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5762

Commits

  • a4d43b8a: fix: added missing translation (kevinstampe)
  • 645b3e9e: Add execution date notification to localization file (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5760

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5758...ui_frontend_5760

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5760

Commits

  • d131c42f: chore(dh): remove component test (dzhavat)
  • c7078b7f: QA fixes (github-actions[bot])

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5716

Commits

  • 9a192743: chore(deps): bump chromaui/action in the version-updates group

Bumps the version-updates group with 1 update: chromaui/action.

Updates chromaui/action from 15.3.1 to 16.3.0


updated-dependencies:

  • dependency-name: chromaui/action
    dependency-version: 16.3.0
    dependency-type: direct:production
    update-type: version-update:semver-major
    dependency-group: version-updates
    ...

Signed-off-by: dependabot[bot] support@github.com (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5758

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5756...ui_frontend_5758

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5758

Commits

  • 3f165b59: Easy candidates (ManBearTM)
  • 51c9669f: Refactor user edit (ManBearTM)
  • 3c3fcac0: Refactor permission details (ManBearTM)
  • fd6bcba2: Refactor user invite (ManBearTM)
  • 018f73a8: Refactor market participant delegation tab (ManBearTM)
  • 373043df: Refactor user roles details (ManBearTM)
  • 02d3be34: Refactor user roles edit (ManBearTM)
  • 13b113b8: Refactor balance responsible relation (ManBearTM)
  • cfe28af0: Refactor debug metering point (ManBearTM)
  • 64206db0: Refactor create charge link (ManBearTM)
  • 4f5e19be: Refactor user management filters (ManBearTM)
  • 5b4a8b25: Refactor actor conversation details (ManBearTM)
  • f2308915: Refactor esett outgoing messages details (ManBearTM)
  • 7ab4b874: Refactor measurements month view (ManBearTM)
  • 2807537f: Remove import (ManBearTM)
  • b4bc8174: Refactor measurements year view (ManBearTM)
  • 7bd042b1: Reduce debounce a little (ManBearTM)
  • 6e2d577a: Refactor process overview (ManBearTM)
  • 3b2909b4: Update libs/dh/admin/feature-user-management/src/invite/assignable-user-roles.component.ts

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • 63312984: Replace afterRenderEffect with autoOpen + key on drawer (ManBearTM)
  • abaa39d5: Replace afterRenderEffect with autoOpen + key on drawer (ManBearTM)
  • f7bae1ce: Fix lint (ManBearTM)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5724

Commits

  • 21711ac8: feat: implement deterministic GraphQL schema export with sorted type definitions (Sejruppen)
  • be1f468b: QA fixes (github-actions[bot])
  • cad8e9ba: Update apps/dh/api-dh/source/DataHub.WebApi/Utilities/SchemaExporter.cs

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

  • dd6eb531: chore: fix test (Sejruppen)
  • cf0ba81d: Merge remote-tracking branch 'origin/fix/schema' into fix/schema (Sejruppen)
  • 708ebf99: QA fixes (github-actions[bot])
  • 29ecc27e: chore: reverts test (Sejruppen)
  • 58f7fc11: chore: updates sorting (Sejruppen)
  • 3c711768: Merge branch 'main' into fix/schema

Conflicts:

apps/dh/api-dh/source/DataHub.WebApi.Tests/Snapshots/SchemaTests.ChangeTest.verified.graphql

libs/dh/shared/data-access-graphql/schema.graphql (Sejruppen)

  • 31234925: QA fixes (github-actions[bot])
  • 463ad424: Merge branch 'main' into fix/schema

Conflicts:

apps/dh/api-dh/source/DataHub.WebApi.Tests/Snapshots/SchemaTests.ChangeTest.verified.graphql

libs/dh/shared/data-access-graphql/schema.graphql (Sejruppen)

  • 7ffa4e2f: updates measurementUnits (Sejruppen)
  • 1d106de3: QA fixes (github-actions[bot])
  • e0541210: feat: adds customerMoveIn to shortLivedProcess (Sejruppen)
  • ac83f275: Merge remote-tracking branch 'origin/move-in/remove-due-date' into fix/schema

Conflicts:

apps/dh/api-dh/source/DataHub.WebApi.Tests/Snapshots/SchemaTests.ChangeTest.verified.graphql

libs/dh/shared/data-access-graphql/schema.graphql (Sejruppen)

  • 7d329b61: Merge remote-tracking branch 'origin/fix/schema' into fix/schema (Sejruppen)
  • 3eda20ba: chore: make stylecop happy (Sejruppen)
  • e3e1868f: fix: change delegatedProcesses to be alphabetical (Sejruppen)
  • 30435ac7: Merge branch 'main' into fix/schema

Conflicts:

apps/dh/api-dh/source/DataHub.WebApi.Tests/Snapshots/SchemaTests.ChangeTest.verified.graphql

libs/dh/metering-point/feature-process-overview/src/components/details/steps.ts

libs/dh/shared/data-access-graphql/schema.graphql (Sejruppen)

  • cb8a63c7: QA fixes (github-actions[bot])

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5757

Commits

  • e998601d: perf(dh): narrow watt intl imports to bypass component barrels

Add per-intl subpath aliases (e.g. @energinet/watt/datepicker/intl) so
dh-watt-translation.providers.ts pulls only the tiny intl service files,
not the full component modules. The barrel re-exports have Angular
component decorators with unavoidable module-level side effects, which
blocked esbuild from tree-shaking the components out of the eager graph. (frontend-specialisten)

  • dfd986c2: perf(dh): lazy-load profile modal from avatar menu

Convert the static import of DhProfileModalComponent in
dh-profile-avatar.component.ts to a dynamic import inside the click
handler. The avatar lives in the always-eager shell header, so the
previous static import dragged the full profile modal (and its
transitive deps WattPhoneFieldComponent, WattTextFieldComponent,
libphonenumber-js metadata) into the initial bundle even though the
modal only renders when the user opens their profile menu.

WattModalService.open accepts the resolved class the same way, so
there is no API change; the modal chunk is fetched on first click
and cached thereafter. (frontend-specialisten)

  • b1b7dcd7: perf(dh): defer Application Insights SDK out of eager bundle

The @microsoft/applicationinsights-* packages were still bundled into the
initial chunk despite the provideAppInitializer + dynamic import in the
service. Two leaks remained:

  1. Value imports of SeverityLevel and DistributedTracingModes at the top
    of the service (and consumers) pulled the full web SDK into the eager
    graph. Replace SeverityLevel with a local DhSeverityLevel const that
    mirrors the enum values; move DistributedTracingModes into the
    existing dynamic import inside init().
  2. The providers file wired the ErrorHandler token directly to
    ApplicationinsightsAngularpluginErrorService, which is a value import
    bundled eagerly. Introduce DhApplicationInsightsErrorHandler, a
    lightweight wrapper that buffers errors and adopts the real handler
    once the SDK finishes loading in the initializer.

Net effect: ~91 KB of App Insights JS moves from eager to a lazy chunk
fetched during APP_INITIALIZER. Bootstrap still waits for the SDK to
load, so error reporting is operational by the time the user can
interact with the app; any errors raised before that point are buffered
and replayed through the real handler on adopt(). (frontend-specialisten)

  • 2df9909b: perf(watt): ship libphonenumber metadata for 9 supported countries only

Switch watt-phone-field from 'libphonenumber-js' (full) + /min/metadata
(~83 KB, all countries) to 'libphonenumber-js/core' + a custom
metadata.json generated for DK, SE, NO, GB, DE, FI, PL, NL, CH
(~6 KB). Users only ever enter phone numbers for these market
participant countries, so the dropped metadata is unreachable.

Net effect: the lazy libphonenumber chunk drops from ~161 KB to ~86 KB.
Every feature route that uses WattPhoneFieldComponent (profile modal,
move-in, market-participant edit/create, user management) loads a
smaller chunk on demand.

Regenerate the metadata with:
bunx libphonenumber-metadata-generator
libs/watt/package/phone-field/phone-metadata.json
--countries DK,SE,NO,GB,DE,FI,PL,NL,CH (frontend-specialisten)

  • d92706de: perf(dh): import WATT_CODE_HIGHLIGHT_WORKER_FACTORY from narrow subpath

The highlight worker provider is registered at app boot via
dhCoreShellProviders, and it was importing from '@energinet/watt/code'
which re-exports WattCodeComponent. The component decorator runs at
module-evaluation and prevents tree-shaking, pulling WattCodeComponent
plus highlight.js into the eager graph.

Add an @energinet/watt/code/worker-token subpath that points directly
at the InjectionToken file, and update the dh-shared-feature-highlight
provider (and mock) to use it.

Net effect: highlight.js leaves the eager bundle. Worker still lazy-loads
when the user lands on a route that renders watt-code. (frontend-specialisten)

  • b404b760: chore(dh): tighten app-dh bundle budget to lock in eager reductions

After phases 1-5, the initial bundle dropped from 2.39 MB to 1.87 MB.
Tighten the production budget from 2.3/2.7 MB to 1.95/2.2 MB so CI
catches any regression that slips a heavy dependency back into the
eager graph. 1.95 MB gives ~80 KB of headroom for normal feature work
before a warning fires; 2.2 MB is the hard stop, still well under the
old baseline. (frontend-specialisten)

  • 593b8447: test(dh): update App Insights provider spec for wrapper error handler

Phase 2 of the bundle reduction replaced ApplicationinsightsAngularpluginErrorService
in the ErrorHandler provider with DhApplicationInsightsErrorHandler, a
lightweight wrapper that loads the real handler lazily. Update the spec
to assert the wrapper type and that adopt() wires delegation to the
real handler. (frontend-specialisten)

  • 7fc73532: QA fixes (github-actions[bot])
  • 92b92fd3: docs(watt): explain phone-metadata.json and how to regenerate it

Add phone-metadata.README.md next to the JSON so future maintainers know
the file is a hand-picked libphonenumber subset (DK, SE, NO, GB, DE, FI,
PL, NL, CH), why it exists (keeps the libphonenumber lazy chunk small),
how to regenerate it with libphonenumber-metadata-generator, and what
additional wiring (watt-phone-field.component.ts countries array,
shared.countries translations, DhPhoneFieldIntlService) a new country
code also needs. (frontend-specialisten)

  • 066ee049: perf(watt): rewrite WattNavList expand/collapse without MatExpansion

WattNavListComponent was pulling @angular/material/expansion into the
eager bundle via the shell's primary navigation. Replace the
mat-expansion-panel with a plain button header, a signal-backed
expanded state, and a content div hidden with the native hidden
attribute. An effect subscribes to child WattNavListItem.isActive
outputs and auto-expands the panel when a descendant route activates,
preserving the previous behavior.

Drop the now-redundant WattExpandOnActiveLinkDirective and the
mat-accordion wrapper in dh-primary-navigation.component. The accordion
wrapper did not set [multi], so removing it does not change user-facing
behavior (each watt-nav-list already toggled independently).

Net effect: @angular/material/expansion and its transitive deps are
gone from the eager bundle (~20 KB saved). (frontend-specialisten)

  • 7ecbe087: perf(dh): lazy-load @ngxpert/hot-toast for notification banners

The notifications center injects DhNotificationsCenterService from the
eager shell, and its showBanner() path statically referenced
HotToastService plus the banner component (which itself imports
HotToastRef from @ngxpert/hot-toast). That pulled the full hot-toast
component template and runtime into the initial bundle even though a
banner only renders when a new notification subscription message
arrives after the user is already logged in and active.

Change showBanner() to dynamically import both @ngxpert/hot-toast and
dh-notification-banner.component on first call. Hot-toast providers are
spun up in a child EnvironmentInjector of the app root, so the service
can resolve HotToastService without relying on a root-level
provideHotToastConfig. Drop the root registration.

Result in an additional ~40 KB savings from the eager bundle. The first
banner after login fetches its chunk on demand, which is acceptable for
a telemetry / announcement popover that isn't on the critical path. (frontend-specialisten)

  • b0bb74d5: chore(dh): tighten initial budget to 1.9 MB warn / 2.1 MB error

Locking in the additional 60 KB saved by removing MatExpansion from the
shell nav and lazy-loading hot-toast. 1.9 MB gives ~85 KB of headroom
before a warning fires and 2.1 MB is the hard stop. (frontend-specialisten)

  • ddda057f: QA fixes (github-actions[bot])
  • cd989c01: Revert "perf(dh): lazy-load @ngxpert/hot-toast for notification banners"

This reverts commit 7ecbe0870989d7cce6c4671f2b5715630eb917dd. (frontend-specialisten)

  • 18c6b971: fix(dh): address buffering edge cases in App Insights ErrorHandler

Review feedback on the delegating ErrorHandler introduced alongside the
App Insights deferral:

  • Drop the console.error in the buffering path. The adopted delegate
    chain already logs through Angular's default ErrorHandler, so keeping
    the buffer-time log produced duplicate console output for every
    bootstrap error.
  • Cap the pre-adopt buffer at 50 entries. If adopt() never runs (e.g.
    the SDK dynamic import fails) we no longer grow the array unbounded.
  • Wrap each replayed delegate.handleError call in try/catch and clear
    the buffer up-front, so a single throwing handler cannot strand the
    remaining queued errors.
  • In the initializer, fall back to adopting a fresh Angular ErrorHandler
    when the SDK or plugin import rejects, so buffered bootstrap errors
    still reach the console instead of being lost.
  • Add spec coverage for the two new paths (throwing delegate during
    replay, buffer cap). (frontend-specialisten)
  • 76eb803a: QA fixes (github-actions[bot])
  • 56f9ecde: review: address remaining review feedback on bundle-reduction
  1. WattNavList ARIA semantics regression: the MatExpansion panel
    previously wired aria-controls on the toggle button and
    role=region + aria-labelledby on the body. Restore those so screen
    reader users still get the same relationship when navigating the
    expandable nav sections. Unique header/body ids are generated via a
    module-level counter (cheap, no injection required).

  2. phone-metadata.README.md: call out the libphonenumber-js version
    compatibility. The committed metadata uses format version 4 which
    tracks libphonenumber-js@^1.10.0. A mismatch after a dependency
    bump throws inside isValidPhoneNumber, so the README now tells the
    next maintainer to regenerate and verify the version key when
    upgrading.

  3. Add a drift test asserting DhSeverityLevel stays in sync with
    @microsoft/applicationinsights-web SeverityLevel in both
    directions. Cheap insurance: if Microsoft adds a new level or
    renumbers existing ones, CI fails on the telemetry lib rather than
    silently reporting wrong severities in production. (frontend-specialisten)

  • 47a8018b: QA fixes (github-actions[bot])
  • 30376289: feat(watt): animate WattNavList expand/collapse with CSS height transition

The MatExpansion replacement dropped the smooth height animation when
folding the expandable nav lists. Restore it with the
grid-template-rows 0fr -> 1fr trick: a grid outer wraps an
overflow:hidden inner, and the outer transitions its single row
track between 0 and content height. Works for any content height
without JS or a magic max-height value.

Respects prefers-reduced-motion, which disables the transition.

Switch the collapsed state from the hidden attribute to inert so the
transition target keeps participating in layout. inert still removes
content from tab focus and the accessibility tree while collapsed,
so the existing semantics are preserved. Spec updated to assert the
inert/aria-expanded pair instead of DOM absence. (frontend-specialisten)

  • 32e06706: fix(dh): catch profile modal chunk load failure

Review feedback: the dynamic import() in openProfileModal has no error
handling. If the chunk fails to load (offline, CDN timeout, stale cache
after a deploy), the promise rejects unhandled and the click button
does nothing. Wrap the import + modal open in try/catch and log the
failure via App Insights so we have telemetry on chunk load errors in
production. The user can retry by clicking the menu item again. (frontend-specialisten)

  • 4a6bf23e: QA fixes (github-actions[bot])

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5754

Commits

  • 4e477357: style: removes the sticky header (Sejruppen)
  • 2bfe8678: chore: change translation (Sejruppen)
  • 6c12fe1b: feat: adds clearing of address (Sejruppen)
  • 8638d3a5: feat: disables clear on same (Sejruppen)
  • c80d6dfe: chore: changes button variant (Sejruppen)
  • e54896c2: QA fixes (github-actions[bot])
  • 16f06ecf: chore: revert schema (Sejruppen)
  • 259b27fc: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)
  • 410787dd: chore: removes file (Sejruppen)
  • 6718e74d: QA fixes (github-actions[bot])
  • 389db9f1: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)
  • a2d67cb5: QA fixes (github-actions[bot])
  • 23d9b3d3: chore: changes size (Sejruppen)
  • fac5d60d: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)
  • 7dc6f739: feat: Adds new size input for toggle (Sejruppen)
  • a82d1bb4: style: adds small size (Sejruppen)
  • 8d961ba2: style: adds small size (Sejruppen)
  • a32b735b: chore: adds helper for clearing and tests (Sejruppen)
  • 7dcfdf55: Merge branch 'main' into customer-data/design (Sejruppen)
  • 0c029536: chore: bump watt version (Sejruppen)
  • dae60deb: QA fixes (github-actions[bot])
  • c24ceb7d: chore: remove file (Sejruppen)
  • e507ec1c: Merge remote-tracking branch 'origin/customer-data/design' into customer-data/design (Sejruppen)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5758

Commits

  • 3f165b59: Easy candidates (ManBearTM)
  • 51c9669f: Refactor user edit (ManBearTM)
  • 3c3fcac0: Refactor permission details (ManBearTM)
  • fd6bcba2: Refactor user invite (ManBearTM)
  • 018f73a8: Refactor market participant delegation tab (ManBearTM)
  • 373043df: Refactor user roles details (ManBearTM)
  • 02d3be34: Refactor user roles edit (ManBearTM)
  • 13b113b8: Refactor balance responsible relation (ManBearTM)
  • cfe28af0: Refactor debug metering point (ManBearTM)
  • 64206db0: Refactor create charge link (ManBearTM)
  • 4f5e19be: Refactor user management filters (ManBearTM)
  • 5b4a8b25: Refactor actor conversation details (ManBearTM)
  • f2308915: Refactor esett outgoing messages details (ManBearTM)
  • 7ab4b874: Refactor measurements month view (ManBearTM)
  • 2807537f: Remove import (ManBearTM)
  • b4bc8174: Refactor measurements year view (ManBearTM)
  • 7bd042b1: Reduce debounce a little (ManBearTM)
  • 6e2d577a: Refactor process overview (ManBearTM)
  • 3b2909b4: Update libs/dh/admin/feature-user-management/src/invite/assignable-user-roles.component.ts

Co-authored-by: Copilot 175728472+Copilot@users.noreply.github.com (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_dotnet_5716

Commits

  • 07465196: chore(deps): bump chromaui/action in the version-updates group

Bumps the version-updates group with 1 update: chromaui/action.

Updates chromaui/action from 15.3.1 to 16.3.0


updated-dependencies:

  • dependency-name: chromaui/action
    dependency-version: 16.3.0
    dependency-type: direct:production
    update-type: version-update:semver-major
    dependency-group: version-updates
    ...

Signed-off-by: dependabot[bot] support@github.com (web-flow)

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago

GreenForce - ui_frontend_5756

What's Changed

Full Changelog: https://github.com/Energinet-DataHub/greenforce-frontend/compare/ui_dotnet_5755...ui_frontend_5756

Energy Systems - Grid Management and Microgrid - TypeScript
Published by github-actions[bot] about 1 month ago