Independent Sub-Pages

Independent sub-pages display entity-specific data in a table with Add/Delete operations, separate from Settings and Membership tabs.

What Agent Infers vs Must Specify

Inferred

Must Specify

Data transformation (string[]{cn: string}[])

Data field name

Type definitions in MembershipTable.tsx

Data format hint (string[])

from type for table

IPA API commands

Component patterns

API parameters

Files to Modify

File

Changes

globalDataTypes.ts

Add field to entity interface

<entity>Utils.tsx

Add to createEmpty<Entity>()

rpc<Entity>.ts

Add queries/mutations

<Entity>Tabs.tsx

Add new tab

AppRoutes.tsx

Add route

API Requirements

Parent entity query: Must include all: true to return data fields.

// Available items query
getPrivileges: build.query<FindRPCResponse, string>({
  query: (searchValue) => getCommand({
    method: "privilege_find",
    params: [[searchValue], { no_members: true }],
  }),
}),

// Add/Remove mutations
addPrivilegeToRole: build.mutation({
  query: (payload) => getCommand({
    method: "role_add_privilege",
    params: [[payload.roleCn], { privilege: payload.privileges }],
  }),
}),

Component Structure

const <Entity><SubPage> = (props) => {
  useUpdateRoute({ pathname: "<parent-pathname>", noBreadcrumb: true });
  
  return (
    <TabLayout id="subpage">
      <MemberOfToolbar ... />
      <MemberTable entityList={data} idKey="cn" from="privileges" ... />
      <Pagination ... />
      {showAddModal && <MemberOfAddModal ... />}
      {showDeleteModal && <MemberOfDeleteModal ... />}
    </TabLayout>
  );
};

Differences from Membership Tabs

Aspect

Membership

Independent

Add API

_add_member + entityType

Custom (e.g., role_add_privilege)

Reusable

Yes

Usually entity-specific

Reference Implementations

  • src/pages/Roles/RolesPrivileges.tsx

  • src/pages/DNSZones/DnsResourceRecords.tsx