Appearance
Entity: dashboardLayout
Entity Type: Database table
Description: A dashboardLayout represents a single user's personalised dashboard — the collection of tiles (dashboardBlock records) they have pinned and how those tiles are arranged. Exactly one dashboardLayout exists per user.
Data Attributes Table
| Attribute Name | Description | Data Type | Default Value | Required (= Nullable) | Unique | Format | Validations | Index | Example |
|---|---|---|---|---|---|---|---|---|---|
| id | Unique identifier for the dashboard layout record. | UUID | Generated in code (app layer) | Yes | Yes | UUID v7 | Must be a valid UUID v7. | Primary Key | 01960000-0000-7000-8000-000000000101 |
| tenantId | Tenant this dashboard layout belongs to. Required on every entity — primary mechanism for data isolation across organisations. | UUID | - | Yes | No | UUID v7 | Foreign Key → tenant.id | name: idx_dashboardLayout_tenantId, type: btree | 01960000-0000-7000-8000-000000000099 |
| userId | The user this dashboard belongs to. | UUID | - | Yes | Yes | UUID v7 | Foreign Key → user.id. Unique per tenant — exactly one dashboardLayout per user. | name: idx_dashboardLayout_userId, type: btree, unique | 01960000-0000-7000-8000-000000000050 |
| createdAt | Timestamp of entity creation. Immutable. | Timestamp with time zone | Set in code | Yes | No | ISO 8601 | - | - | 2026-07-24T10:00:00Z |
| updatedAt | Timestamp of last entity update — every layout change (move/resize/add/remove tile) updates this. | Timestamp with time zone | Set in code | Yes | No | ISO 8601 | - | - | 2026-07-24T10:00:00Z |
| deletedAt | Timestamp of soft delete. Once set, immutable. Records with deletedAt IS NULL are considered active. | Timestamp with time zone | null | No | No | ISO 8601 | - | - | null |
| createdBy | Identifier of the actor who created this record. | String | - | Yes | No | type:actor | - | - | user:01960000-0000-7000-8000-000000000050 |
| updatedBy | Identifier of the actor who last updated this record. | String | - | Yes | No | type:actor | - | - | user:01960000-0000-7000-8000-000000000050 |
Audited fields
Recorded on created (in full), updated (changed only) and deleted (in full): userId.
Excluded: none.
Every entry would carry subjectEntityType = user / subjectEntityId = userId — exactly one layout per user, so the layout's own history and "what changed on this person's dashboard" are the same question. Most layout changes in practice are dashboardBlock entries filed against this record's children, not updated entries here — this entity's own updated would fire only if a future feature adds a directly-editable layout-level field.
Not registered for entityName resolution — one row per user (userId unique); described via the user it belongs to.