Gå til innhold

Menyadministrasjon

Menyadministrasjon styrer sidemenyen i ePortal. Verktøyet er bygget rundt tre databasenivåer — Menu1 → Menu2 → Menu3 — og lar administrator legge til, redigere, slette, dra-og-slipp-omorganisere og diagnostisere menypunkter per tenant. Konfigurasjonen er per tenant og overstyrer eventuelt modul-leverte standarder.

Tilgang

Hvem Hva trengs
Rolle Administrator (avgjøres av moduleID === 99 på brukerens userAccess.new)
Modul Systeminnstillinger — moduleId: 99, adminPage: true
Hvordan komme dit Innstillinger → Systeminnstillinger → fanen "Menyadministrasjon" (URL: /settings/system-setting?tab=menuManagement)

Tilgangen valideres av ActivateService + ModuleGuard på ruten system-setting (setting-routing.module.ts:33). Selve fanevalget skjer i komponenten basert på moduleID 99 (system-setting.component.ts:43).

hele Menyadministrasjon-fanen åpen med de fem underfanene synlige i toppen

Faner i Menyadministrasjon

Komponenten har fem faner — menu1, menu2, menu3, menuTree og routeHealth (menu-management.component.html:4):

Fane Hva den gjør
Toppnivå-meny (Menu1) Liste over rotnodene i menyen. Legg til / rediger / slett.
Undernivå-meny (Menu2) Liste over andre nivå. Hver rad er knyttet til en Menu1-forelder.
Sub-undernivå-meny (Menu3) Liste over tredje nivå. Hver rad har Menu1- og Menu2-forelder.
Trestruktur Visuell sammenstilling av hele menyen med dra-og-slipp for rekkefølge og flytting på tvers av nivå.
Rute-helse Diagnostikk som sammenstiller AngularPageLink mot frontend-manifestet og rapporterer brutte og foreldreløse ruter.

Hver listefane viser et smart-grid med kolonnene parentMenu (kun Menu2/Menu3), Menynavn, Angular rute, Sorteringsrekkefølge, Skjult (øye-ikon) og en handlingskapsel med rediger/slett. Slett-knappen for Menu1/Menu2 er deaktivert hvis raden har barn (row.hasChildren).

Grid-ene har globalt søkefelt og grupperingspanel (dra en kolonneoverskrift opp i panelet for å gruppere). Menu2-listen er som standard sortert på overordnet meny og deretter sorteringsrekkefølge; Menu3-listen på Menu1-forelder, Menu2-forelder og deretter sorteringsrekkefølge — begge speiler rekkefølgen slik sidemenyen faktisk rendres.

Menypunkt-skjema (Menu1 / Menu2 / Menu3)

Skjemaene åpnes som offcanvas-drawer på høyre side fra "Legg til"-knappen eller rediger-handlingen. Feltene er nesten identiske mellom nivåene; forskjellene står i tabellen.

Felt Type Påkrevd Validering / detaljer
Menynavn Tekst Ja Maks 50 tegn (menu-management.component.ts:250)
Overordnet toppnivå-meny Nedtrekk Ja for Menu2 og Menu3 Velger kun blant ikke-skjulte Menu1-rader
Overordnet undernivå-meny Nedtrekk Ja for Menu3 Deaktivert til Menu1-forelder er valgt; filtreres ut fra valgt Menu1
Modultilgang Nedtrekk Nei Liste over moduler aktivert for tenanten (getModulesForDomain). Ingen modulbegrensning er gyldig verdi. Felt-hint: "Velg hvilken modul dette menypunktet tilhører for tilgangskontroll"
Angular rute Rute-velger eller URL Nei Bytte mellom rute-velger og fri-tekst URL styres av bryteren "Bruk ekstern URL". Maks 500 tegn.
Bruk ekstern URL Bryter Når på: erstatter rute-velgeren med <input type="url">. Sidebar rendrer http(s)-lenker som ny fane.
Angular ikon Ikon-velger Nei Velg fra /assets/tablerIcons/outline/*.svg via grid med søk. Felt-verdien er filstien. Tøm med rød x. Maks 200 tegn.
Sorteringsrekkefølge Heltall Ja min="0". Ingen øvre grense i koden. Lavere tall vises først. Default ved nytt punkt = antall eksisterende rader på samme nivå.
Synlig i meny (kun Menu2) Avkryssing Default true. Styrer IsVisibleInMenu-kolonnen.
Skjult Avkryssing Default false. Skjuler raden i sidebar; raden er fortsatt tilgjengelig via direkte URL.
Skjult i ny Angular-app (kun Menu2) Avkryssing Default false. Egen flagg for ny app-skall.
Avansert — Legacy lenke Tekst Nei Skjult bak "Vis avanserte felt"-toggle. Brukes for gammel ?mod=X-syntaks for bakoverkompatibilitet.
Avansert — Webside (kun Menu2/Menu3) Nedtrekk Nei Skjult bak avansert-toggle. Velger en eksisterende wv_WebPage-rad.

Rute-velgeren ([app-menu-route-picker]) henter ruter fra modulenes *.menu.ts-manifest. Når en rute velges fylles AngularPageLink, moduleID og AngularIcon inn automatisk; menynavnet fylles bare hvis feltet er tomt fra før — eksisterende admin-tilpasset navn overskrives aldri (menu-management.component.ts:224-244).

På Menu2 og Menu3 filtreres rute-velgeren av valgt modul via restrictToModuleId. Menu1-skjemaet viser hele utvalget ([showAdmin]="true").

Menu1-skjemaet åpent i drawer med ikon-velger ekspandert

Modultilgang (ikke brukernivå-tilgang)

Hvert menypunkt kan knyttes til én modul via moduleID-feltet. Sidebaren skjuler punktet for brukere som mangler tilgang til den modulen (validering via wv_Userright/ModuleGuard). Det finnes ingen multi-select av brukernivåer per menypunkt i denne UI-en — tilgangsmodellen er per modul, ikke per wv_UserLevel.

— Ingen modulbegrensning — betyr at menypunktet ikke filtreres på modul; det vises for alle brukere som ellers ser menyen.

Trestruktur — dra og slipp

Fanen Trestruktur kaller MenuManagementService.getMenuTree() og rendrer <app-menu-tree>. Treet vises som standard kollapset — klikk pilen på et menypunkt for å utvide grenen du jobber med. Brukeren kan:

  • Endre rekkefølge innen samme nivå (dra-vertikalt). Lagres via reorderMenu({ level, parentId, orderedIds }).
  • Flytte/forfremme/degradere ved å dra et element til en annen forelder eller annet nivå. Lagres via moveMenuNode(payload).
  • Klikke på en node for å åpne tilsvarende rediger-skjema (samme drawer som listefanene).

Tre-tilstand:

  • Lasting vises med spinner og MenuManagement.tree.errorLoading på feil.
  • Etter vellykket lagring vises toast MenuManagement.tree.reorderSaved eller MenuManagement.tree.moveSaved.
  • På feil rulles lokal sortering tilbake ved å laste treet på nytt fra serveren (menu-management.component.ts:572-629).
  • Etter hver lagring oppdateres også sidebar-cachen i localStorage (refreshNavigationMenu) slik at endringene reflekteres umiddelbart.

Trestruktur-fanen med ett menypunkt midt i en dra-operasjon mellom to forskjellige Menu1-foreldre

Rute-helse — diagnostikk

Fanen Rute-helse henter alle menyens AngularPageLink-verdier fra serveren (getRouteHealth()) og sammenstiller dem med frontend-manifestet (menuRouteRegistry.getAll()):

  • Brutte ruter — menypunkter som peker på en sti som ikke finnes i noe *.menu.ts-manifest. Brukere får 404 eller tom side. Rad-badge er rød. Antall vises også som badge på selve fanen.
  • Foreldreløse ruter — ruter registrert i et manifest, men ingen menypunkter peker på dem. De er kun tilgjengelige via direkte URL.
  • Alt OK — grønn alert hvis begge listene er tomme.

Sammenligningen er case-insensitiv (toLowerCase() på begge sider) (menu-management.component.ts:555-570).

Rute-helse-fanen med både brutte og foreldreløse ruter listet i sine respektive tabeller

Slik legger du til et menypunkt

  1. Åpne Innstillinger → Systeminnstillinger → Menyadministrasjon.
  2. Velg fanen for ønsket nivå (Toppnivå / Undernivå / Sub-undernivå).
  3. Klikk Legg til toppnivå-meny (eller tilsvarende for nivået).
  4. På Menu2/Menu3: velg overordnet meny først.
  5. Skriv menynavn.
  6. (Valgfritt) Velg Modultilgang for å begrense punktet til en spesifikk modul.
  7. Velg en rute fra rute-velgeren — eller aktiver bryteren Bruk ekstern URL og skriv en http(s)-adresse.
  8. (Valgfritt) Velg et ikon via ikon-grid (søk støttes).
  9. Juster Sorteringsrekkefølge ved behov (default = antall eksisterende rader på samme nivå).
  10. (Valgfritt) Trykk Vis avanserte felt for å sette Legacy lenke eller Webside.
  11. Klikk Lagre.
  12. Sidebaren oppdateres automatisk — last siden på nytt om noe ikke vises.

Slik omorganiserer du menyen

  1. Bytt til fanen Trestruktur.
  2. Dra et menypunkt vertikalt for å endre rekkefølge innen samme forelder.
  3. Dra et menypunkt til en annen forelder for å flytte det (forfremme/degradere på tvers av nivåer).
  4. Endringen lagres automatisk når du slipper. Toast bekrefter "Rekkefølge oppdatert" eller "Menypunkt flyttet".
  5. Klikk på en node for å åpne rediger-skjemaet for raden.

Slik finner du brutte ruter

  1. Bytt til fanen Rute-helse.
  2. Vent på diagnostikken (lastes når fanen åpnes første gang).
  3. Inspiser tabellen Brutte ruter — disse menypunktene peker på ruter som ikke lenger finnes i Angular-koden. Åpne hvert punkt fra listefanen og enten oppdater AngularPageLink eller slett raden.
  4. Inspiser tabellen Foreldreløse ruter — disse rutene er registrert i kode men ingen meny peker på dem. Vurder om de bør legges til i menyen.
  5. Klikk Oppdater for å kjøre diagnostikken på nytt etter rettelser.

Vanlige problemer

"Skjult" gir ikke tilgangskontroll

Skjult-flagget skjuler kun radene i sidebaren — sidene er fortsatt tilgjengelige via direkte URL. For å hindre tilgang må modulen fjernes for brukernivået (wv_Userright/Modul-administrasjon).

Sletting av Menu1/Menu2 er deaktivert

Slett-knappen er deaktivert ([disabled]="row.hasChildren") når raden har barn. Slett barna først (Menu2/Menu3) før du sletter forelderen.

Rute-velgeren viser ingen ruter på Menu2/Menu3

Rute-velgeren filtreres av valgt Modultilgang på Menu2/Menu3 via restrictToModuleId. Hvis ingen modul er valgt eller modulen ikke har manifest-ruter, blir listen tom. Bytt modul eller bruk Bruk ekstern URL for fri-tekst-rute.

"Bruk ekstern URL" tømmer feltet

Når bryteren bytter mellom rute-modus og URL-modus tømmes AngularPageLink automatisk hvis nåværende verdi ikke passer (http-URL i rute-modus eller intern rute i URL-modus) (menu-management.component.ts:211-222).

Menypunkter vises ikke etter lagring

Etter hver lagring oppdaterer refreshNavigationMenu() localStorage-cachen og dispatcher et storage-event. Hvis sidebaren ikke reflekterer endringen umiddelbart, last siden på nytt (CTRL+F5).

Feilmeldinger fra serveren vises som toast

  • MenuManagement.errorLoadingMenu{1|2|3} — kunne ikke laste listen.
  • MenuManagement.errorSavingMenu{1|2|3} — lagring feilet.
  • MenuManagement.errorDeletingMenu{1|2|3} — sletting feilet (typisk pga. barn eller FK-konflikt).
  • MenuManagement.tree.errorReordering / errorMoving — dra-og-slipp-operasjon feilet; treet rulles tilbake.
  • MenuManagement.routeHealth.errorLoading — kunne ikke kjøre diagnostikk.

Relaterte sider