TenantAtlas/specs/133-detail-page-template/contracts/enterprise-detail-pages.openapi.yaml
ahmido d4fb886de0 feat: standardize enterprise detail pages (#162)
## Summary
- introduce a shared enterprise-detail composition layer for Filament detail pages
- migrate BackupSet, BaselineSnapshot, EntraGroup, and OperationRun detail screens to the shared summary-first layout
- add regression and unit coverage for section hierarchy, related context, degraded states, and duplicate fact/badge presentation

## Scope
- adds shared support classes under `app/Support/Ui/EnterpriseDetail`
- adds shared enterprise detail Blade partials under `resources/views/filament/infolists/entries/enterprise-detail`
- updates touched Filament resources/pages to use the shared detail shell
- includes Spec 133 artifacts under `specs/133-detail-page-template`

## Notes
- branch: `133-detail-page-template`
- base: `dev`
- commit: `fd294c7`

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #162
2026-03-10 23:06:26 +00:00

375 lines
9.1 KiB
YAML

openapi: 3.1.0
info:
title: Enterprise Detail Page Composition Contract
version: 0.1.0
description: >-
Internal planning contract for the shared enterprise detail-page composition model.
These schemas describe the logical read model that backs the HTML detail pages for the
initial aligned targets.
paths:
/admin/baseline-snapshots/{snapshot}:
get:
summary: Resolve BaselineSnapshot enterprise detail page data
operationId: getBaselineSnapshotEnterpriseDetail
parameters:
- name: snapshot
in: path
required: true
schema:
type: integer
responses:
'200':
description: Shared enterprise detail page model for a BaselineSnapshot detail page
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/EnterpriseDetailPage'
- type: object
properties:
resourceType:
const: baseline_snapshot
/admin/t/{tenant}/backup-sets/{backupSet}:
get:
summary: Resolve BackupSet enterprise detail page data
operationId: getBackupSetEnterpriseDetail
parameters:
- name: tenant
in: path
required: true
schema:
type: string
- name: backupSet
in: path
required: true
schema:
type: integer
responses:
'200':
description: Shared enterprise detail page model for a BackupSet detail page
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/EnterpriseDetailPage'
- type: object
properties:
resourceType:
const: backup_set
/admin/t/{tenant}/entra-groups/{entraGroup}:
get:
summary: Resolve EntraGroup enterprise detail page data
operationId: getEntraGroupEnterpriseDetail
parameters:
- name: tenant
in: path
required: true
schema:
type: string
- name: entraGroup
in: path
required: true
schema:
type: integer
responses:
'200':
description: Shared enterprise detail page model for an EntraGroup detail page
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/EnterpriseDetailPage'
- type: object
properties:
resourceType:
const: entra_group
/admin/operations/{run}:
get:
summary: Resolve OperationRun enterprise detail page data
operationId: getOperationRunEnterpriseDetail
parameters:
- name: run
in: path
required: true
schema:
type: integer
responses:
'200':
description: Shared enterprise detail page model for an OperationRun detail page
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/EnterpriseDetailPage'
- type: object
properties:
resourceType:
const: operation_run
components:
schemas:
EnterpriseDetailPage:
type: object
required:
- resourceType
- scope
- header
- mainSections
- supportingCards
- technicalSections
properties:
resourceType:
type: string
enum:
- baseline_snapshot
- backup_set
- entra_group
- operation_run
scope:
type: string
enum:
- workspace
- tenant
- workspace-context
header:
$ref: '#/components/schemas/SummaryHeader'
mainSections:
type: array
items:
$ref: '#/components/schemas/DetailSection'
supportingCards:
type: array
items:
$ref: '#/components/schemas/SupportingCard'
technicalSections:
type: array
items:
$ref: '#/components/schemas/TechnicalSection'
emptyStateNotes:
type: array
items:
$ref: '#/components/schemas/EmptyState'
SummaryHeader:
type: object
required:
- title
- statusBadges
- keyFacts
- primaryActions
properties:
title:
type: string
subtitle:
type:
- string
- 'null'
descriptionHint:
type:
- string
- 'null'
statusBadges:
type: array
items:
$ref: '#/components/schemas/StatusBadge'
keyFacts:
type: array
items:
$ref: '#/components/schemas/KeyFact'
primaryActions:
type: array
items:
$ref: '#/components/schemas/PageAction'
DetailSection:
type: object
required:
- id
- kind
- title
- visible
properties:
id:
type: string
kind:
type: string
enum:
- core_details
- current_status
- related_context
- operational_context
- recent_activity
- domain_detail
title:
type: string
items:
type: array
items:
oneOf:
- $ref: '#/components/schemas/KeyFact'
- $ref: '#/components/schemas/RelatedContextItem'
action:
oneOf:
- $ref: '#/components/schemas/PageAction'
- type: 'null'
emptyState:
oneOf:
- $ref: '#/components/schemas/EmptyState'
- type: 'null'
visible:
type: boolean
SupportingCard:
type: object
required:
- kind
- title
- visible
properties:
kind:
type: string
enum:
- status
- timestamps
- related_context
- quick_actions
- health
- summary
title:
type: string
items:
type: array
items:
oneOf:
- $ref: '#/components/schemas/KeyFact'
- $ref: '#/components/schemas/RelatedContextItem'
- $ref: '#/components/schemas/PageAction'
visible:
type: boolean
TechnicalSection:
type: object
required:
- title
- entries
- visible
properties:
title:
type: string
entries:
type: array
items:
$ref: '#/components/schemas/KeyFact'
collapsible:
type: boolean
visible:
type: boolean
RelatedContextItem:
type: object
required:
- label
- contextType
- available
properties:
label:
type: string
contextType:
type: string
enum:
- parent
- child
- source_run
- tenant
- workspace
- artifact
- linked_record
value:
type:
- string
- 'null'
url:
type:
- string
- 'null'
available:
type: boolean
emptyReason:
type:
- string
- 'null'
PageAction:
type: object
required:
- label
- placement
- destructive
- requiresConfirmation
- visible
properties:
label:
type: string
placement:
type: string
enum:
- header
- supporting_card
- section
url:
type:
- string
- 'null'
actionName:
type:
- string
- 'null'
destructive:
type: boolean
requiresConfirmation:
type: boolean
visible:
type: boolean
StatusBadge:
type: object
required:
- domain
- value
properties:
domain:
type: string
value:
type: string
label:
type:
- string
- 'null'
KeyFact:
type: object
required:
- label
properties:
label:
type: string
value:
type:
- string
- integer
- number
- boolean
- 'null'
emphasis:
type:
- string
- 'null'
EmptyState:
type: object
required:
- title
- message
properties:
title:
type: string
message:
type: string
actionLabel:
type:
- string
- 'null'
actionUrl:
type:
- string
- 'null'