Skip to content

Feat/16446 navigation validation#4016

Merged
walldenfilippa merged 17 commits intomainfrom
feat/16446-navigation-validation
Apr 7, 2026
Merged

Feat/16446 navigation validation#4016
walldenfilippa merged 17 commits intomainfrom
feat/16446-navigation-validation

Conversation

@Magnusrm
Copy link
Copy Markdown
Contributor

@Magnusrm Magnusrm commented Feb 25, 2026

Description

Related Issue(s)

Verification/QA

  • Manual functionality testing
    • I have tested these changes manually
    • Creator of the original issue (or service owner) has been contacted for manual testing (or will be contacted when released in alpha)
    • No testing done/necessary
  • Automated tests
    • Unit test(s) have been added/updated
    • Cypress E2E test(s) have been added/updated
    • No automatic tests are needed here (no functional changes/additions)
    • I want someone to help me make some tests
  • UU/WCAG (follow these guidelines until we have our own)
    • I have tested with a screen reader/keyboard navigation/automated wcag validator
    • No testing done/necessary (no DOM/visual changes)
    • I want someone to help me perform accessibility testing
  • User documentation @ altinn-studio-docs
    • Has been added/updated
    • No functionality has been changed/added, so no documentation is needed
    • I will do that later/have created an issue
  • Support in Altinn Studio
    • Issue(s) created for support in Studio
    • This change/feature does not require any changes to Altinn Studio
  • Sprint board
    • The original issue (or this PR itself) has been added to the Team Apps project and to the current sprint board
    • I don't have permissions to do that, please help me out
  • Labels
    • I have added a kind/* and backport* label to this PR for proper release notes grouping
    • I don't have permissions to add labels, please help me out

Summary by CodeRabbit

  • New Features
    • Page-level validation on navigation: advancing can be prevented when intermediate pages contain validation errors.
    • Per-group/subform default expansion: navigation groups and subforms can start expanded by default.
    • Page-level validation now takes precedence over button-level settings and is used by navigation controls and action buttons to determine validation flow.
  • Tests
    • Added/updated tests covering page-vs-button validation and navigation behaviors.

walldenfilippa and others added 9 commits January 30, 2026 09:39
Co-authored-by: walldenfilippa <filippa.walden@digdir.no>
…and validateOnPrevious/Backward with preventNavigation prop for validationOnNavigation
* add basic logic for preventing navigation

* change wording
* added PageValidation on layoutSets and layoutSettings

---------

Co-authored-by: walldenfilippa <filippa.walden@digdir.no>
* refactor: navigation validation backward and improve page validation hooks

* refactor preventing navigation to use simplified config

---------

Co-authored-by: walldenfilippa <filippa.walden@digdir.no>
Co-authored-by: Magnus Revheim Martinsen <mrmartinsen.96@gmail.com>
* added prop expandedByDefault to groups for sidenavigation

* added prop expandedByDefault to subform sidenavigation

---------

Co-authored-by: walldenfilippa <filippa.walden@digdir.no>
@Magnusrm Magnusrm linked an issue Feb 25, 2026 that may be closed by this pull request
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 25, 2026

📝 Walkthrough

Walkthrough

Adds configurable page-level validation on navigation and a per-group expanded-by-default option; propagates these settings through layout/context hooks; prevents forward sidebar navigation when intermediate pages require validation and have errors; updates navigation components, hooks, and tests to enforce and respect this behavior.

Changes

Cohort / File(s) Summary
Type definitions & config
src/codegen/Common.ts, src/types/index.ts
Added optional validationOnNavigation?: PageValidation to GlobalPageSettings, IPagesBaseSettings, and ILayoutFile.data.layout; added expandedByDefault?: boolean to INavigationBasePageGroup; introduced IPreventNavigationLayouts index type.
Layout contexts & settings
src/features/form/layout/LayoutsContext.tsx, src/features/form/layoutSettings/LayoutSettingsContext.tsx
Extended LayoutContextValue with layoutCollection and preventNavigationLayouts; added useLayoutCollection and usePreventNavigationLayouts hooks; processLayouts derives preventNavigationLayouts from validationOnNavigation; adjusted usePageSettings typing to allow optional validationOnNavigation.
Navigation utilities & hooks
src/features/navigation/utils.ts, src/features/navigation/useNavigateToPageWithValidation.ts, src/hooks/usePageValidation.ts, src/features/validation/callbacks/onPageNavigationValidation.ts
Added useGetNavigationIsPrevented() predicate to determine per-target navigation blocking by inspecting page order, intermediate pages' validationOnNavigation, and node error state; added useNavigateToPageWithValidation() to perform guarded navigation with validation checks; added useEffectivePageValidation/usePageValidation to resolve per-page validation (layout override → global); minor JSDoc normalization.
Navigation components
src/features/navigation/components/Page.tsx, src/features/navigation/components/PageGroup.tsx, src/features/navigation/components/SubformsForPage.tsx
Threaded new expandedByDefault prop through components; switched navigation calls to useNavigateToPageWithValidation(); use useGetNavigationIsPrevented() to disable navigation controls when blocked; initialize group/subform open state from expandedByDefault or current page.
Layout button components
src/layout/CustomButton/CustomButtonComponent.tsx, src/layout/NavigationBar/NavigationBarComponent.tsx, src/layout/NavigationButtons/NavigationButtonsComponent.tsx, src/layout/NavigationButtons/NavigationButtonsComponent.test.tsx
Integrated page-level validation via usePageValidation() (page-level overrides component-level); disabled states now include per-page prevention; updated navigation button handlers to use resolved page validation for forward/backward decisions; expanded tests to cover page-vs-button validation precedence and added fixtures.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Feat/16446 navigation validation' directly references the feature issue and core domain but lacks clarity about the specific prevention mechanism.
Description check ✅ Passed The PR description includes a related issue link and verification checklist completions, but lacks a detailed summary of the changes and their purpose.
Linked Issues check ✅ Passed The implementation addresses all requirements: prevents forward navigation when pages are incomplete, preserves visibility of dynamic pages, integrates with existing validation rules, and enforces validation on navigation without introducing new validation logic.
Out of Scope Changes check ✅ Passed All code changes directly support navigation validation requirements. Minor comment removal and JSDoc formatting are housekeeping within scope.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/16446-navigation-validation

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@Magnusrm Magnusrm added backport-ignore This PR is a new feature and should not be cherry-picked onto release branches kind/product-feature Pull requests containing new features labels Feb 25, 2026
Magnusrm and others added 5 commits February 25, 2026 09:39
…4027)

* feat: enhance navigation validation by integrating validation checks in navigation components

* removed one hook and added useGetNavigationIsPrevented on pageGroup aswell

* temporary notes

* remove temporary note

* update tests

---------

Co-authored-by: walldenfilippa <filippa.walden@digdir.no>
@walldenfilippa
Copy link
Copy Markdown
Contributor

/publish

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 10, 2026

PR release:

  • <link rel="stylesheet" type="text/css" href="https://altinncdn.no/toolkits/altinn-app-frontend/4.25.3-pr.4143.16446-navigation-validation.4ddf7840/altinn-app-frontend.css">
  • <script src="https://altinncdn.no/toolkits/altinn-app-frontend/4.25.3-pr.4143.16446-navigation-validation.4ddf7840/altinn-app-frontend.js"></script>

⚙️ Building...
✅ Done!

…ed validationOnNavigation to GlobalPageSettings (#4064)

Co-authored-by: walldenfilippa <filippa.walden@digdir.no>
@walldenfilippa
Copy link
Copy Markdown
Contributor

/publish

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 23, 2026

PR release:

  • <link rel="stylesheet" type="text/css" href="https://altinncdn.no/toolkits/altinn-app-frontend/4.25.3-pr.4304.16446-navigation-validation.836e656c/altinn-app-frontend.css">
  • <script src="https://altinncdn.no/toolkits/altinn-app-frontend/4.25.3-pr.4304.16446-navigation-validation.836e656c/altinn-app-frontend.js"></script>

⚙️ Building...
✅ Done!

Copy link
Copy Markdown
Contributor

@lassopicasso lassopicasso left a comment

Choose a reason for hiding this comment

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

Great job 🚀

@walldenfilippa walldenfilippa marked this pull request as ready for review April 7, 2026 07:53
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/features/navigation/components/PageGroup.tsx (1)

81-102: ⚠️ Potential issue | 🔴 Critical

Single-page groups still bypass page-leave validation.

Line 98 still does a raw navigateToPage(page). The regular page entries now go through maybeSaveOnPageChange() and onPageNavigationValidation(...) first in src/features/navigation/components/Page.tsx, so any NavigationPageGroupSingle can still be used to step forward without triggering the new sidebar validation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/features/navigation/components/PageGroup.tsx` around lines 81 - 102, The
single-page group button currently calls navigateToPage(page) directly (in the
onClick inside PageGroup.tsx), bypassing the new page-leave validation; update
the onClick handler (the performProcess async block) to replicate the same flow
used in Page.tsx by first invoking maybeSaveOnPageChange() and
onPageNavigationValidation(...) and only calling navigateToPage(page) if
validation succeeds, preserving the existing performProcess wrapper and calling
onNavigate() after successful navigation; reference the existing symbols
navigateToPage, maybeSaveOnPageChange, onPageNavigationValidation,
performProcess, and onNavigate to locate and implement the change.
src/features/navigation/components/SubformsForPage.tsx (1)

68-91: ⚠️ Potential issue | 🟠 Major

expandedByDefault now turns this into an always-open, unlabeled section.

PageGroupMultiple uses the same prop only to seed isOpen, but here it removes the toggle entirely. That means users can never collapse the subform section again, and Line 90 keeps aria-labelledby={buttonId} even when no element with that id is rendered.

Suggested shape
-      {!expandedByDefault && (
-        <button
-          id={buttonId}
-          aria-expanded={isOpen}
-          aria-owns={listId}
-          onClick={() => setIsOpen((o) => !o)}
-          className={cn(classes.subformExpandButton, 'fds-focus')}
-        >
+      <button
+        id={buttonId}
+        aria-expanded={isOpen}
+        aria-controls={listId}
+        onClick={() => setIsOpen((o) => !o)}
+        className={cn(classes.subformExpandButton, 'fds-focus')}
+      >
           <span className={classes.subformGroupName}>
             <Lang id={title} />
             &nbsp;({dataElements.length})
           </span>
           <ChevronDownIcon
             aria-hidden
             className={cn(classes.subformExpandChevron, { [classes.subformExpandChevronOpen]: isOpen })}
           />
-        </button>
-      )}
+      </button>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/features/navigation/components/SubformsForPage.tsx` around lines 68 - 91,
The component currently removes the toggle button when expandedByDefault is
true, which breaks collapsing and leaves aria-labelledby pointing at a
non-existent buttonId; change the logic so expandedByDefault only seeds the
initial isOpen state (like PageGroupMultiple) but still renders the toggle
button tied to isOpen and setIsOpen (i.e., always render the button that uses
buttonId and controls listId), and if you must hide a visual toggle use a
visually-hidden class rather than omitting the element so aria-labelledby
remains valid; ensure aria-expanded, aria-owns, and aria-labelledby remain
consistent with the rendered button.
🧹 Nitpick comments (2)
src/layout/NavigationButtons/NavigationButtonsComponent.test.tsx (1)

139-141: Avoid fixed sleeps in these assertions.

These tests are waiting on timing, not on the state transition they care about, so they'll get flaky as soon as navigation/validation takes longer than 100ms on CI. Please switch to a real async signal here (waitFor, waitForElementToBeRemoved, or a mocked navigation assertion) instead of hard-coded delays.

Also applies to: 154-156, 168-170

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/layout/NavigationButtons/NavigationButtonsComponent.test.tsx` around
lines 139 - 141, Replace the hard-coded 100ms sleeps after
userEvent.click(screen.getByText('next')) with a proper async wait that observes
the actual UI change or navigation; e.g., use waitFor or
waitForElementToBeRemoved to wait for the next button to disappear or for the
expected element/state to appear (replace the new Promise(setTimeout...) call in
the test at userEvent.click(...) with await waitFor(() => /* assertion for
expected state */) or await waitForElementToBeRemoved(() =>
screen.getByText('next'))); apply the same change to the other occurrences
around the tests referenced (the similar blocks at the other two locations).
src/hooks/usePageValidation.ts (1)

5-20: Remove the redundant cast.

layoutCollection[pageKey]?.data?.validationOnNavigation already comes from the generated layout type, so as ILayoutFile['data']['validationOnNavigation'] only masks type drift and adds an import you do not need.

Suggested cleanup
-import type { ILayoutFile, PageValidation } from 'src/layout/common.generated';
+import type { PageValidation } from 'src/layout/common.generated';
@@
-    const pageValidation = currentPageLayout?.data
-      ?.validationOnNavigation as ILayoutFile['data']['validationOnNavigation'];
+    const pageValidation = currentPageLayout?.data?.validationOnNavigation;

As per coding guidelines, "Avoid using any or type casting (as type) in TypeScript; instead, improve typing by removing such casts and anys to maintain proper type safety".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/hooks/usePageValidation.ts` around lines 5 - 20, The code in
useEffectivePageValidation is using an unnecessary cast on
layoutCollection[pageKey]?.data?.validationOnNavigation; remove the trailing "as
ILayoutFile['data']['validationOnNavigation']" from the pageValidation
assignment so the value is inferred from the generated types, and then delete
the now-unused import of ILayoutFile at the top; keep the rest of
useEffectivePageValidation, layoutCollection, and effectivePageValidation logic
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/features/navigation/utils.ts`:
- Around line 157-195: The current useGetNavigationIsPrevented implementation
scans only intermediate pages for validation errors and can allow skipping pages
that the sidebar marks incomplete; instead derive the allowed forward target
using the same completion logic the menu uses (useValidationsForPages or the
helper that computes page completion), e.g. call useValidationsForPages()/the
completion predicate over order starting at currentPageId to compute the
furthestAllowedIndex (or allowedPageKey) and then prevent navigation if
targetIndex > furthestAllowedIndex; update useGetNavigationIsPrevented
(referencing useGetNavigationIsPrevented, order, currentPageId, targetPageKey,
and useValidationsForPages) to use that computed allowed boundary rather than
the simple slice-check.

---

Outside diff comments:
In `@src/features/navigation/components/PageGroup.tsx`:
- Around line 81-102: The single-page group button currently calls
navigateToPage(page) directly (in the onClick inside PageGroup.tsx), bypassing
the new page-leave validation; update the onClick handler (the performProcess
async block) to replicate the same flow used in Page.tsx by first invoking
maybeSaveOnPageChange() and onPageNavigationValidation(...) and only calling
navigateToPage(page) if validation succeeds, preserving the existing
performProcess wrapper and calling onNavigate() after successful navigation;
reference the existing symbols navigateToPage, maybeSaveOnPageChange,
onPageNavigationValidation, performProcess, and onNavigate to locate and
implement the change.

In `@src/features/navigation/components/SubformsForPage.tsx`:
- Around line 68-91: The component currently removes the toggle button when
expandedByDefault is true, which breaks collapsing and leaves aria-labelledby
pointing at a non-existent buttonId; change the logic so expandedByDefault only
seeds the initial isOpen state (like PageGroupMultiple) but still renders the
toggle button tied to isOpen and setIsOpen (i.e., always render the button that
uses buttonId and controls listId), and if you must hide a visual toggle use a
visually-hidden class rather than omitting the element so aria-labelledby
remains valid; ensure aria-expanded, aria-owns, and aria-labelledby remain
consistent with the rendered button.

---

Nitpick comments:
In `@src/hooks/usePageValidation.ts`:
- Around line 5-20: The code in useEffectivePageValidation is using an
unnecessary cast on layoutCollection[pageKey]?.data?.validationOnNavigation;
remove the trailing "as ILayoutFile['data']['validationOnNavigation']" from the
pageValidation assignment so the value is inferred from the generated types, and
then delete the now-unused import of ILayoutFile at the top; keep the rest of
useEffectivePageValidation, layoutCollection, and effectivePageValidation logic
unchanged.

In `@src/layout/NavigationButtons/NavigationButtonsComponent.test.tsx`:
- Around line 139-141: Replace the hard-coded 100ms sleeps after
userEvent.click(screen.getByText('next')) with a proper async wait that observes
the actual UI change or navigation; e.g., use waitFor or
waitForElementToBeRemoved to wait for the next button to disappear or for the
expected element/state to appear (replace the new Promise(setTimeout...) call in
the test at userEvent.click(...) with await waitFor(() => /* assertion for
expected state */) or await waitForElementToBeRemoved(() =>
screen.getByText('next'))); apply the same change to the other occurrences
around the tests referenced (the similar blocks at the other two locations).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0d5329cb-1eca-40b1-beae-85acd3754b3f

📥 Commits

Reviewing files that changed from the base of the PR and between 0fca32f and bc4b8f6.

📒 Files selected for processing (14)
  • src/codegen/Common.ts
  • src/features/form/layout/LayoutsContext.tsx
  • src/features/form/layoutSettings/LayoutSettingsContext.tsx
  • src/features/navigation/components/Page.tsx
  • src/features/navigation/components/PageGroup.tsx
  • src/features/navigation/components/SubformsForPage.tsx
  • src/features/navigation/utils.ts
  • src/features/validation/callbacks/onPageNavigationValidation.ts
  • src/hooks/usePageValidation.ts
  • src/layout/CustomButton/CustomButtonComponent.tsx
  • src/layout/NavigationBar/NavigationBarComponent.tsx
  • src/layout/NavigationButtons/NavigationButtonsComponent.test.tsx
  • src/layout/NavigationButtons/NavigationButtonsComponent.tsx
  • src/types/index.ts

Comment thread src/features/navigation/utils.ts
* fix comments in feat/16446-navigation-validation

* fixed tests in NavigationButtons tests

* refactor: implement navigation with validation logic in Page and PageGroup components

---------

Co-authored-by: walldenfilippa <filippa.walden@digdir.no>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/features/navigation/useNavigateToPageWithValidation.ts (1)

12-37: Consider wrapping the returned function in useCallback.

The async function is recreated on every render, which may cause unnecessary re-renders in consuming components that use it as a dependency or pass it to child components. Since the function closes over values from other hooks, wrapping it in useCallback with appropriate dependencies would provide a stable reference.

♻️ Suggested refactor
+import { useCallback } from 'react';
 import { useOnPageNavigationValidation } from 'src/features/validation/callbacks/onPageNavigationValidation';
 import { useNavigationParam } from 'src/hooks/navigation';
 import { useNavigatePage } from 'src/hooks/useNavigatePage';
 import { useEffectivePageValidation } from 'src/hooks/usePageValidation';

 export function useNavigateToPageWithValidation() {
   const currentPageId = useNavigationParam('pageKey');
   const { navigateToPage, order, maybeSaveOnPageChange } = useNavigatePage();
   const onPageNavigationValidation = useOnPageNavigationValidation();
   const { getPageValidation } = useEffectivePageValidation(currentPageId ?? '');

-  return async (targetPage: string, onNavigate?: () => void) => {
+  return useCallback(async (targetPage: string, onNavigate?: () => void) => {
     if (!currentPageId || targetPage === currentPageId) {
       return;
     }

     const currentIndex = order.indexOf(currentPageId);
     const targetIndex = order.indexOf(targetPage);
     if (currentIndex === -1 || targetIndex === -1) {
       return;
     }

     const isForward = targetIndex > currentIndex;
     const validationOnNavigation = getPageValidation();

     await maybeSaveOnPageChange();

     if (isForward && validationOnNavigation) {
       const hasValidationErrors = await onPageNavigationValidation(currentPageId, validationOnNavigation);
       if (hasValidationErrors) {
         return;
       }
     }

     await navigateToPage(targetPage);
     onNavigate?.();
-  };
+  }, [currentPageId, order, getPageValidation, maybeSaveOnPageChange, onPageNavigationValidation, navigateToPage]);
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/features/navigation/useNavigateToPageWithValidation.ts` around lines 12 -
37, Wrap the async function returned by useNavigateToPageWithValidation in
React's useCallback to stabilize its identity; specifically, change the
anonymous returned function to a useCallback that depends on the external values
it closes over (currentPageId, order, getPageValidation, maybeSaveOnPageChange,
onPageNavigationValidation, navigateToPage) so consumers don't receive a new
function each render and to avoid unnecessary re-renders.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/features/navigation/useNavigateToPageWithValidation.ts`:
- Around line 12-37: Wrap the async function returned by
useNavigateToPageWithValidation in React's useCallback to stabilize its
identity; specifically, change the anonymous returned function to a useCallback
that depends on the external values it closes over (currentPageId, order,
getPageValidation, maybeSaveOnPageChange, onPageNavigationValidation,
navigateToPage) so consumers don't receive a new function each render and to
avoid unnecessary re-renders.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5dbe5a0f-9672-4ba4-892b-096e6437fc89

📥 Commits

Reviewing files that changed from the base of the PR and between bc4b8f6 and 84d3491.

📒 Files selected for processing (6)
  • src/features/navigation/components/Page.tsx
  • src/features/navigation/components/PageGroup.tsx
  • src/features/navigation/components/SubformsForPage.tsx
  • src/features/navigation/useNavigateToPageWithValidation.ts
  • src/hooks/usePageValidation.ts
  • src/layout/NavigationButtons/NavigationButtonsComponent.test.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/layout/NavigationButtons/NavigationButtonsComponent.test.tsx
  • src/hooks/usePageValidation.ts

@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented Apr 7, 2026

@walldenfilippa walldenfilippa merged commit 5d2fe5b into main Apr 7, 2026
15 of 16 checks passed
@walldenfilippa walldenfilippa deleted the feat/16446-navigation-validation branch April 7, 2026 12:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-ignore This PR is a new feature and should not be cherry-picked onto release branches kind/product-feature Pull requests containing new features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Forhindre fri navigasjon med sidemeny-navigasjon

3 participants