# Menus

> Browse PeopleSoft classic menu definitions with bars, items, and the components they navigate to.

---

LLMS index: [llms.txt](/llms.txt)

---

<div id="pslens-context-panel" class="card border-info mb-4 d-none">
  <div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle">
    <i class="bi bi-info-circle-fill me-2"></i>
    <span>Tailored Operational Context</span>
  </div>
  <div class="card-body p-0">
    <ul class="list-group list-group-flush">
      <li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Target Database:</strong>
        <span id="ctx-db" class="badge bg-secondary font-monospace">&mdash;</span>
      </li>
      <li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Context Type:</strong>
        <span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase">&mdash;</span>
      </li>
      <li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Alert Severity:</strong>
        <span id="ctx-severity" class="badge">&mdash;</span>
      </li>
      <li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Triggered Time:</strong>
        <span id="ctx-time" class="text-muted small">&mdash;</span>
      </li>
      <li id="row-details" class="list-group-item py-2 d-none">
        <strong id="label-details" class="d-block mb-1">Firing Context:</strong>
        <code id="ctx-details" class="d-block p-2 bg-light border rounded small" style="white-space: pre-wrap; word-break: break-all;">&mdash;</code>
      </li>
    </ul>
  </div>
</div>

<script>
  (function() {
    const params = new URLSearchParams(window.location.search);
    const metadata = params.get('metadata');
    if (!metadata) return;

    try {
      
      const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
      const jsonStr = decodeURIComponent(escape(window.atob(base64)));
      const data = JSON.parse(jsonStr);

      if (data) {
        let hasData = false;

        if (data.db) {
          document.getElementById('ctx-db').textContent = data.db;
          document.getElementById('row-db').classList.remove('d-none');
          hasData = true;
        }

        if (data.type) {
          document.getElementById('ctx-type').textContent = data.type;
          document.getElementById('row-type').classList.remove('d-none');
          hasData = true;
        }

        if (data.severity) {
          const severityBadge = document.getElementById('ctx-severity');
          const severity = data.severity.toLowerCase();
          severityBadge.textContent = severity.toUpperCase();
          if (severity === 'critical') {
            severityBadge.className = 'badge bg-danger';
          } else if (severity === 'warning') {
            severityBadge.className = 'badge bg-warning text-dark';
          } else {
            severityBadge.className = 'badge bg-info';
          }
          document.getElementById('row-severity').classList.remove('d-none');
          hasData = true;
        }

        if (data.t) {
          const date = new Date(data.t * 1000);
          document.getElementById('ctx-time').textContent = date.toLocaleString();
          document.getElementById('row-time').classList.remove('d-none');
          hasData = true;
        }

        if (data.details) {
          document.getElementById('ctx-details').textContent = data.details;

          
          const labelDetails = document.getElementById('label-details');
          if (data.type === 'object') {
            labelDetails.textContent = 'Object Metadata Details:';
          } else if (data.type === 'report') {
            labelDetails.textContent = 'Report Description:';
          } else {
            labelDetails.textContent = 'Firing Context:';
          }

          document.getElementById('row-details').classList.remove('d-none');
          hasData = true;
        }

        if (hasData) {
          document.getElementById('pslens-context-panel').classList.remove('d-none');
        }
      }
    } catch (e) {
      console.error('Failed to parse operational context metadata:', e);
    }
  })();
</script>


## What It Is

Menus are PeopleSoft's classic navigation containers. Each menu (`PSMENUDEFN`) holds a set of bars, each bar a set of items (`PSMENUITEM`), and each item points to a component the user can launch. Even in a Fluid-dominant world, classic menus matter for security: Permission List authorizations are granted on menu/component pairs, so understanding which menu owns a component is fundamental to access analysis.

## Search Page

URL: `/menus?db={database}`

<figure><img src="/images/screenshots/metadata/menus-search.png"
    alt="Menu search results for PROCESS% showing PROCESSMONITOR, PROCESS_SCHEDULER, and others"><figcaption>
      <p>Menu search results for <code>PROCESS%</code></p>
    </figcaption>
</figure>


Wildcard `%` search supported. Each card shows the menu type (Standard or Pop-up) and the descriptive long name.

## Detail Page

URL: `/menus/{MENUNAME}?db={database}`

<figure><img src="/images/screenshots/metadata/menus-detail.png"
    alt="Detail page for PROCESSMONITOR menu"><figcaption>
      <p>Menu detail page for <code>PROCESSMONITOR</code></p>
    </figcaption>
</figure>


The main pane shows **Menu Properties** (type, owner, audit metadata). The sidebar has 2 related-data toggles.

<figure><img src="/images/screenshots/metadata/menus-detail-expanded.png"
    alt="Menu detail page with all panels expanded"><figcaption>
      <p>All panels expanded — short page since menus are simple structures</p>
    </figcaption>
</figure>


## Related Data Panels

### Menu Items

<figure><img src="/images/screenshots/metadata/menus-panel-items.png"
    alt="Menu Items panel"><figcaption>
      <p>Every bar and item in the menu with the target component</p>
    </figcaption>
</figure>


Every bar and item in the menu, with the component (and market) each item launches. Each component is deep-linked into its own psLens detail page, letting you walk straight from a menu entry into the transaction it triggers.

### Included in Projects

<figure><img src="/images/screenshots/metadata/menus-panel-projects.png"
    alt="Included in Projects panel for the menu"><figcaption>
      <p>App Designer projects that include this menu</p>
    </figcaption>
</figure>


App Designer projects that include this menu.

## What This Consolidates

In App Designer:

- Open the menu to see bars and items
- Double-click each item to confirm the target component
- Right-click items individually to drill into the component

In psLens, the menu detail page shows the full item list with the component each item launches. Clicking the component name jumps you into a view that already has the menu reference loaded.
