# Component Interfaces

> Browse PeopleSoft Component Interface definitions with items, methods, PeopleCode, and consistency checks.

---

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

Component Interfaces (CIs) are PeopleSoft's programmatic façade over a component. They expose component properties as get/set properties and component events as callable methods, so integration code can drive the same business logic the UI uses. psLens reads `PSBCDEFN` for the CI header, `PSBCITEM` for the property/key list, and `PSBCMETHODS` for the methods. It also runs two consistency checks against the underlying component to catch the most common breakage: properties that no longer map to a valid record field, and required fields the CI doesn't expose.

## Search Page

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

<figure><img src="/images/screenshots/metadata/component-interfaces-search.png"
    alt="Component Interface search results for USER% showing USERMAINT_SELF, USER_PROFILE and related CIs"><figcaption>
      <p>Component Interface search results for <code>USER%</code></p>
    </figcaption>
</figure>


Wildcard `%` search supported. Each result card shows the underlying component and CI description.

## Detail Page

URL: `/componentinterfaces/{CINAME}?db={database}`

<figure><img src="/images/screenshots/metadata/component-interfaces-detail.png"
    alt="Detail page for USER_PROFILE CI showing properties and items list"><figcaption>
      <p>Component Interface detail page for <code>USER_PROFILE</code></p>
    </figcaption>
</figure>


The main pane shows **Component Interface Properties** (underlying component, market, security access, owner) plus the items list. The sidebar has 6 related-data toggles, including two consistency-check panels unique to CIs.

## Related Data Panels

### Items

<figure><img src="/images/screenshots/metadata/component-interfaces-panel-items.png"
    alt="Items panel listing all 45 CI properties"><figcaption>
      <p>Every CI property with key flag, record/field binding, and standard/custom indicator</p>
    </figcaption>
</figure>


Every CI property (`PSBCITEM`): its record/field binding, key indicator, and whether it's a standard or custom-named property.

### CI Methods

<figure><img src="/images/screenshots/metadata/component-interfaces-panel-methods.png"
    alt="CI Methods panel"><figcaption>
      <p>Standard and user-defined methods on the CI</p>
    </figcaption>
</figure>


Standard methods (Get, Find, Create, Save, Cancel) plus any user-defined methods. Each method links into the matching PeopleCode.

### Invalid Properties Check

<figure><img src="/images/screenshots/metadata/component-interfaces-panel-invalid-props.png"
    alt="Invalid Properties Check panel"><figcaption>
      <p>Items that no longer match a valid record field on the underlying component</p>
    </figcaption>
</figure>


A consistency check. Flags CI items that no longer match a valid record field on the underlying component — the most common failure mode after a record schema change.

### Missing Fields

<figure><img src="/images/screenshots/metadata/component-interfaces-panel-missing-fields.png"
    alt="Missing Fields panel"><figcaption>
      <p>Required fields on the underlying component that the CI does not expose</p>
    </figcaption>
</figure>


A consistency check. Flags fields on the underlying component that are required (key fields, search keys, required-input fields) but are not exposed as CI properties. Helps spot where a CI cannot drive a transaction to completion.

### PeopleCode References

<figure><img src="/images/screenshots/metadata/component-interfaces-panel-pc-references.png"
    alt="PeopleCode References panel"><figcaption>
      <p>PeopleCode programs anywhere in the database that instantiate this CI</p>
    </figcaption>
</figure>


PeopleCode programs anywhere in the database that mention this CI by name. Useful for finding the App Engine, Service Operation handler, or other CI program that drives this interface.

### Included in Projects

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


App Designer projects that include this CI.

## What This Consolidates

To do the same work in App Designer:

- Open the CI to see the property list and methods
- Open the underlying component separately to confirm record/field bindings
- Manually compare CI items against record fields to find drift
- Run **Find In PeopleCode** to find code that calls this CI
- Open each owning project for migration history

The Invalid Properties panel finds CI items whose record/field binding no longer exists on the underlying component. Missing Fields finds required component fields the CI doesn't expose — a CI cannot drive a transaction to completion without them. Both are the diff between the CI snapshot and the live component, a check App Designer makes you do by hand.
