WIP - central operations
This commit is contained in:
386
frontend/composables/useCentralEntities.ts
Normal file
386
frontend/composables/useCentralEntities.ts
Normal file
@@ -0,0 +1,386 @@
|
||||
/**
|
||||
* Static field configurations for central database entities
|
||||
* These entities don't have dynamic field definitions like tenant objects
|
||||
*/
|
||||
|
||||
import { FieldType, ViewMode } from '@/types/field-types'
|
||||
import type { FieldConfig, ListViewConfig, DetailViewConfig, EditViewConfig } from '@/types/field-types'
|
||||
|
||||
// ==================== TENANTS ====================
|
||||
|
||||
export const tenantFields: FieldConfig[] = [
|
||||
{
|
||||
id: 'name',
|
||||
apiName: 'name',
|
||||
label: 'Tenant Name',
|
||||
type: FieldType.TEXT,
|
||||
isRequired: true,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
id: 'slug',
|
||||
apiName: 'slug',
|
||||
label: 'Slug',
|
||||
type: FieldType.TEXT,
|
||||
isRequired: false,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
sortable: true,
|
||||
helpText: 'Unique identifier for the tenant (auto-generated from name if not provided)',
|
||||
},
|
||||
{
|
||||
id: 'primaryDomain',
|
||||
apiName: 'primaryDomain',
|
||||
label: 'Primary Domain',
|
||||
type: FieldType.TEXT,
|
||||
isRequired: true,
|
||||
showOnList: false,
|
||||
showOnDetail: false,
|
||||
showOnEdit: true,
|
||||
helpText: 'Primary subdomain for this tenant (e.g., "acme" for acme.yourdomain.com)',
|
||||
},
|
||||
{
|
||||
id: 'status',
|
||||
apiName: 'status',
|
||||
label: 'Status',
|
||||
type: FieldType.SELECT,
|
||||
isRequired: true,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
options: [
|
||||
{ label: 'Active', value: 'active' },
|
||||
{ label: 'Suspended', value: 'suspended' },
|
||||
{ label: 'Deleted', value: 'deleted' },
|
||||
],
|
||||
defaultValue: 'active',
|
||||
},
|
||||
{
|
||||
id: 'dbHost',
|
||||
apiName: 'dbHost',
|
||||
label: 'Database Host',
|
||||
type: FieldType.TEXT,
|
||||
isRequired: false,
|
||||
showOnList: false,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
helpText: 'Leave blank to use default database host',
|
||||
},
|
||||
{
|
||||
id: 'dbPort',
|
||||
apiName: 'dbPort',
|
||||
label: 'Database Port',
|
||||
type: FieldType.NUMBER,
|
||||
isRequired: false,
|
||||
showOnList: false,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
defaultValue: 3306,
|
||||
helpText: 'Leave blank to use default port (3306)',
|
||||
},
|
||||
{
|
||||
id: 'dbName',
|
||||
apiName: 'dbName',
|
||||
label: 'Database Name',
|
||||
type: FieldType.TEXT,
|
||||
isRequired: false,
|
||||
showOnList: false,
|
||||
showOnDetail: true,
|
||||
showOnEdit: false,
|
||||
helpText: 'Auto-generated based on tenant slug',
|
||||
},
|
||||
{
|
||||
id: 'dbUsername',
|
||||
apiName: 'dbUsername',
|
||||
label: 'Database Username',
|
||||
type: FieldType.TEXT,
|
||||
isRequired: false,
|
||||
showOnList: false,
|
||||
showOnDetail: true,
|
||||
showOnEdit: false,
|
||||
helpText: 'Auto-generated based on tenant slug',
|
||||
},
|
||||
{
|
||||
id: 'createdAt',
|
||||
apiName: 'createdAt',
|
||||
label: 'Created At',
|
||||
type: FieldType.DATETIME,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: false,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
id: 'updatedAt',
|
||||
apiName: 'updatedAt',
|
||||
label: 'Updated At',
|
||||
type: FieldType.DATETIME,
|
||||
showOnList: false,
|
||||
showOnDetail: true,
|
||||
showOnEdit: false,
|
||||
},
|
||||
]
|
||||
|
||||
export const tenantListConfig: ListViewConfig = {
|
||||
objectApiName: 'Tenant',
|
||||
mode: ViewMode.LIST,
|
||||
fields: tenantFields,
|
||||
pageSize: 25,
|
||||
searchable: true,
|
||||
filterable: true,
|
||||
exportable: true,
|
||||
}
|
||||
|
||||
export const tenantDetailConfig: DetailViewConfig = {
|
||||
objectApiName: 'Tenant',
|
||||
mode: ViewMode.DETAIL,
|
||||
fields: tenantFields,
|
||||
sections: [
|
||||
{
|
||||
title: 'Basic Information',
|
||||
fields: ['name', 'slug', 'status'],
|
||||
},
|
||||
{
|
||||
title: 'Database Configuration',
|
||||
fields: ['dbHost', 'dbPort', 'dbName', 'dbUsername'],
|
||||
collapsible: true,
|
||||
},
|
||||
{
|
||||
title: 'System Information',
|
||||
fields: ['createdAt', 'updatedAt'],
|
||||
collapsible: true,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export const tenantEditConfig: EditViewConfig = {
|
||||
objectApiName: 'Tenant',
|
||||
mode: ViewMode.EDIT,
|
||||
fields: tenantFields,
|
||||
sections: [
|
||||
{
|
||||
title: 'Basic Information',
|
||||
fields: ['name', 'slug', 'primaryDomain', 'status'],
|
||||
},
|
||||
{
|
||||
title: 'Advanced Options',
|
||||
description: 'Optional database configuration (leave blank for defaults)',
|
||||
fields: ['dbHost', 'dbPort'],
|
||||
collapsible: true,
|
||||
defaultCollapsed: true,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
// ==================== DOMAINS ====================
|
||||
|
||||
export const domainFields: FieldConfig[] = [
|
||||
{
|
||||
id: 'domain',
|
||||
apiName: 'domain',
|
||||
label: 'Domain',
|
||||
type: FieldType.TEXT,
|
||||
isRequired: true,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
sortable: true,
|
||||
helpText: 'Subdomain for this tenant (e.g., "acme" for acme.yourapp.com)',
|
||||
},
|
||||
{
|
||||
id: 'tenantId',
|
||||
apiName: 'tenantId',
|
||||
label: 'Tenant',
|
||||
type: FieldType.BELONGS_TO,
|
||||
isRequired: true,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
relationObject: 'Tenant',
|
||||
relationDisplayField: 'name',
|
||||
},
|
||||
{
|
||||
id: 'isPrimary',
|
||||
apiName: 'isPrimary',
|
||||
label: 'Primary Domain',
|
||||
type: FieldType.BOOLEAN,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
defaultValue: false,
|
||||
helpText: 'Mark as the primary domain for this tenant',
|
||||
},
|
||||
{
|
||||
id: 'createdAt',
|
||||
apiName: 'createdAt',
|
||||
label: 'Created At',
|
||||
type: FieldType.DATETIME,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: false,
|
||||
sortable: true,
|
||||
},
|
||||
]
|
||||
|
||||
export const domainListConfig: ListViewConfig = {
|
||||
objectApiName: 'Domain',
|
||||
mode: ViewMode.LIST,
|
||||
fields: domainFields,
|
||||
pageSize: 25,
|
||||
searchable: true,
|
||||
filterable: true,
|
||||
exportable: true,
|
||||
}
|
||||
|
||||
export const domainDetailConfig: DetailViewConfig = {
|
||||
objectApiName: 'Domain',
|
||||
mode: ViewMode.DETAIL,
|
||||
fields: domainFields,
|
||||
sections: [
|
||||
{
|
||||
title: 'Domain Information',
|
||||
fields: ['domain', 'tenantId', 'isPrimary', 'createdAt'],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export const domainEditConfig: EditViewConfig = {
|
||||
objectApiName: 'Domain',
|
||||
mode: ViewMode.EDIT,
|
||||
fields: domainFields,
|
||||
sections: [
|
||||
{
|
||||
title: 'Domain Configuration',
|
||||
fields: ['domain', 'tenantId', 'isPrimary'],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
// ==================== USERS (Central Admin Users) ====================
|
||||
|
||||
export const centralUserFields: FieldConfig[] = [
|
||||
{
|
||||
id: 'email',
|
||||
apiName: 'email',
|
||||
label: 'Email',
|
||||
type: FieldType.EMAIL,
|
||||
isRequired: true,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
id: 'firstName',
|
||||
apiName: 'firstName',
|
||||
label: 'First Name',
|
||||
type: FieldType.TEXT,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
id: 'lastName',
|
||||
apiName: 'lastName',
|
||||
label: 'Last Name',
|
||||
type: FieldType.TEXT,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
id: 'password',
|
||||
apiName: 'password',
|
||||
label: 'Password',
|
||||
type: FieldType.TEXT, // Will be treated as password in edit view
|
||||
isRequired: true,
|
||||
showOnList: false,
|
||||
showOnDetail: false,
|
||||
showOnEdit: true,
|
||||
helpText: 'Leave blank to keep existing password',
|
||||
},
|
||||
{
|
||||
id: 'role',
|
||||
apiName: 'role',
|
||||
label: 'Role',
|
||||
type: FieldType.SELECT,
|
||||
isRequired: true,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
options: [
|
||||
{ label: 'Admin', value: 'admin' },
|
||||
{ label: 'Super Admin', value: 'superadmin' },
|
||||
],
|
||||
defaultValue: 'admin',
|
||||
},
|
||||
{
|
||||
id: 'isActive',
|
||||
apiName: 'isActive',
|
||||
label: 'Active',
|
||||
type: FieldType.BOOLEAN,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: true,
|
||||
defaultValue: true,
|
||||
},
|
||||
{
|
||||
id: 'createdAt',
|
||||
apiName: 'createdAt',
|
||||
label: 'Created At',
|
||||
type: FieldType.DATETIME,
|
||||
showOnList: true,
|
||||
showOnDetail: true,
|
||||
showOnEdit: false,
|
||||
sortable: true,
|
||||
},
|
||||
]
|
||||
|
||||
export const centralUserListConfig: ListViewConfig = {
|
||||
objectApiName: 'User',
|
||||
mode: ViewMode.LIST,
|
||||
fields: centralUserFields,
|
||||
pageSize: 25,
|
||||
searchable: true,
|
||||
filterable: true,
|
||||
exportable: true,
|
||||
}
|
||||
|
||||
export const centralUserDetailConfig: DetailViewConfig = {
|
||||
objectApiName: 'User',
|
||||
mode: ViewMode.DETAIL,
|
||||
fields: centralUserFields,
|
||||
sections: [
|
||||
{
|
||||
title: 'User Information',
|
||||
fields: ['email', 'firstName', 'lastName', 'role', 'isActive'],
|
||||
},
|
||||
{
|
||||
title: 'System Information',
|
||||
fields: ['createdAt'],
|
||||
collapsible: true,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export const centralUserEditConfig: EditViewConfig = {
|
||||
objectApiName: 'User',
|
||||
mode: ViewMode.EDIT,
|
||||
fields: centralUserFields,
|
||||
sections: [
|
||||
{
|
||||
title: 'User Information',
|
||||
fields: ['email', 'firstName', 'lastName'],
|
||||
},
|
||||
{
|
||||
title: 'Access & Security',
|
||||
fields: ['password', 'role', 'isActive'],
|
||||
},
|
||||
],
|
||||
}
|
||||
Reference in New Issue
Block a user