# Independent Sub-Pages > **Part of:** [Sub-Pages guide](../sub-pages.md) > **See also:** [Settings Tab](04-settings-tab.md) | [Membership Tabs](06-membership-tabs.md) Independent sub-pages display entity-specific data in a table with Add/Delete operations, separate from Settings and Membership tabs. ## Prompt Template (Recommended) ``` Based on the sub-pages guide, generate a '' independent page for '' with: - IPA API object: `` - Data field: `` () - Table column: "" - Parent pathname: `` - Entity data type: `` - Operations: 'Refresh', 'Delete', 'Add' - 'Add' modal: - IPA call for available options: `_find` with `` - IPA command: `_add_` - 'Delete' modal: - IPA command: `_remove_` ``` ### Placeholders | Placeholder | Example | |-------------|---------| | `` | `Privileges` | | `` | `role` | | `` (``) | `memberof_privilege` (`string[]`) | | `` | `roles` | | `` | `Role` | | `_find` | `privilege_find` | | `_add_` | `role_add_privilege` | ### Example ``` Based on the sub-pages guide, generate a 'Privileges' independent page for 'Roles' with: - IPA API object: `role` - Data field: `memberof_privilege` (string[] of privilege names) - Table column: "Privilege name" - Parent pathname: `roles` - Entity data type: `Role` - Operations: 'Refresh', 'Delete', 'Add' - 'Add' modal: - IPA call for available options: `privilege_find` with `no_members: true` - IPA command: `role_add_privilege` - 'Delete' modal: - IPA command: `role_remove_privilege` ``` ## 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 | | `Utils.tsx` | Add to `createEmpty()` | | `rpc.ts` | Add queries/mutations | | `Tabs.tsx` | Add new tab | | `AppRoutes.tsx` | Add route | ## API Requirements **Parent entity query:** Must include `all: true` to return data fields. ```typescript // Available items query getPrivileges: build.query({ 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 ```tsx const = (props) => { useUpdateRoute({ pathname: "", noBreadcrumb: true }); return ( {showAddModal && } {showDeleteModal && } ); }; ``` ## 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`