Add standard command menu items (#18527)

## Add standard command menu items

### Summary

This PR introduces standard command menu items, migrating hardcoded
command menu actions to the backend command menu item architecture
powered by front components. It adds a new `twenty-standard-application`
package that defines, builds, and registers front components as standard
command menu items, gated behind the `IS_COMMAND_MENU_ITEM_ENABLED`
feature flag.

### Description

- **New `twenty-standard-application` package**: Contains front
component definitions with an esbuild-based build pipeline that
generates minified `.mjs` bundles and a manifest with checksums.
- **Server-side registration**: New constants register all items with
metadata (labels, icons, positions, availability types, conditional
expressions). A `StandardFrontComponentUploadService` uploads built
components to file storage.
- **`FALLBACK` availability type**: New enum value for command menu
items that appear as fallback options (e.g., "Search Records" fallback).
- **`CommandMenuContextApi` refactor**
- **Conditional availability enhancements**: New array-based helper
functions for evaluating multi-record conditions.
- **Frontend wiring** (twenty-front):
`useCommandMenuItemFrontComponentCommands`

## Next steps

Only simple commands have been implemented for now:
- **Navigation (9)** -- `CommandLink`: go-to-companies,
go-to-dashboards, go-to-notes, go-to-opportunities, go-to-people,
go-to-runs, go-to-settings, go-to-tasks, go-to-workflows
- **Side panel (4)** -- `CommandOpenSidePanelPage`: ask-ai,
search-records, search-records-fallback, view-previous-ai-chats

We still have to implement front components for all the following
commands:
All have placeholder `execute` logic (`async () => {}`) with a `// TODO:
implement execute logic` comment:

**Record (22)**
- `add-to-favorites`, `remove-from-favorites`
- `create-new-record`, `create-new-view`
- `delete-single-record`, `delete-multiple-records`
- `destroy-single-record`, `destroy-multiple-records`
- `restore-single-record`, `restore-multiple-records`
- `export-from-record-index`, `export-from-record-show`,
`export-multiple-records`, `export-note-to-pdf`, `export-view`
- `hide-deleted-records`, `see-deleted-records`
- `import-records`, `merge-multiple-records`, `update-multiple-records`
- `navigate-to-next-record`, `navigate-to-previous-record`

**Page layout (3)** -- `cancel-record-page-layout`,
`edit-record-page-layout`, `save-record-page-layout`

**Dashboard (4)** -- `cancel-dashboard-layout`, `duplicate-dashboard`,
`edit-dashboard-layout`, `save-dashboard-layout`

**Workflow (10)** -- `activate-workflow`, `add-node-workflow`,
`deactivate-workflow`, `discard-draft-workflow`, `duplicate-workflow`,
`see-active-version-workflow`, `see-runs-workflow`,
`see-versions-workflow`, `test-workflow`, `tidy-up-workflow`

**Workflow version (4)** -- `see-runs-workflow-version`,
`see-versions-workflow-version`, `see-workflow-workflow-version`,
`use-as-draft-workflow-version`

**Workflow run (3)** -- `see-version-workflow-run`,
`see-workflow-workflow-run`, `stop-workflow-run`
This commit is contained in:
Raphaël Bosi
2026-03-10 18:36:41 +01:00
committed by GitHub
parent 25d9f2fcce
commit 2de022afcf
252 changed files with 10972 additions and 253 deletions
@@ -93,7 +93,7 @@ export const seedFeatureFlags = async ({
{
key: FeatureFlagKey.IS_COMMAND_MENU_ITEM_ENABLED,
workspaceId: workspaceId,
value: true,
value: false,
},
{
key: FeatureFlagKey.IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED,
@@ -0,0 +1,834 @@
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
import { CommandMenuItemAvailabilityType } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity';
import { STANDARD_FRONT_COMPONENTS } from './standard-front-component.constant';
export const STANDARD_COMMAND_MENU_ITEMS = {
navigateToNextRecord: {
universalIdentifier: '3db2457d-8e96-4b8e-94c9-ed95d3f95738',
label: 'Navigate to next record',
shortLabel: null,
icon: 'IconChevronDown',
position: 0,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and not isInSidePanel',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.navigateToNextRecord.universalIdentifier,
},
navigateToPreviousRecord: {
universalIdentifier: 'ec10f871-415b-420b-8150-7e09f6f04833',
label: 'Navigate to previous record',
shortLabel: null,
icon: 'IconChevronUp',
position: 1,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and not isInSidePanel',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.navigateToPreviousRecord.universalIdentifier,
},
createNewRecord: {
universalIdentifier: '08d255bf-58cd-47a5-bd82-78c5c58592f1',
label: 'Create new record',
shortLabel: 'New record',
icon: 'IconPlus',
position: 2,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression:
'pageType == "INDEX_PAGE" and objectPermissions.canUpdateObjectRecords and not hasAnySoftDeleteFilterOnView',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.createNewRecord.universalIdentifier,
},
deleteSingleRecord: {
universalIdentifier: '6652773f-b9a9-4fa3-a52c-e2f2e259e430',
label: 'Delete',
shortLabel: 'Delete',
icon: 'IconTrash',
position: 3,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords == 1 and not hasAnySoftDeleteFilterOnView and objectPermissions.canSoftDeleteObjectRecords and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.deleteSingleRecord.universalIdentifier,
},
deleteMultipleRecords: {
universalIdentifier: 'cde86f1f-2c13-42b1-812b-f2b2b468cb83',
label: 'Delete records',
shortLabel: 'Delete',
icon: 'IconTrash',
position: 4,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords >= 2 and objectPermissions.canSoftDeleteObjectRecords and not hasAnySoftDeleteFilterOnView and numberOfSelectedRecords < 10000',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.deleteMultipleRecords.universalIdentifier,
},
restoreSingleRecord: {
universalIdentifier: '8b3a1cae-3e4d-43c1-a71f-48592b2e47ff',
label: 'Restore record',
shortLabel: 'Restore',
icon: 'IconRefresh',
position: 5,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords == 1 and everyDefined(selectedRecords, "deletedAt") and objectPermissions.canSoftDeleteObjectRecords and (pageType == "RECORD_PAGE" or hasAnySoftDeleteFilterOnView)',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.restoreSingleRecord.universalIdentifier,
},
restoreMultipleRecords: {
universalIdentifier: '8b740c9d-d99a-45a8-812f-809caaf420ac',
label: 'Restore records',
shortLabel: 'Restore',
icon: 'IconRefresh',
position: 6,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords >= 2 and objectPermissions.canSoftDeleteObjectRecords and hasAnySoftDeleteFilterOnView and numberOfSelectedRecords < 10000',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.restoreMultipleRecords.universalIdentifier,
},
destroySingleRecord: {
universalIdentifier: '44a78417-c394-4bc8-961f-98b503030ddb',
label: 'Permanently destroy record',
shortLabel: 'Destroy',
icon: 'IconTrashX',
position: 7,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords == 1 and objectPermissions.canDestroyObjectRecords and everyDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.destroySingleRecord.universalIdentifier,
},
destroyMultipleRecords: {
universalIdentifier: 'c630b3fb-7920-40d1-9906-77d0aa797608',
label: 'Permanently destroy records',
shortLabel: 'Destroy',
icon: 'IconTrashX',
position: 8,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords >= 2 and objectPermissions.canDestroyObjectRecords and hasAnySoftDeleteFilterOnView and numberOfSelectedRecords < 10000',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.destroyMultipleRecords.universalIdentifier,
},
addToFavorites: {
universalIdentifier: '38bf80c3-bd55-4753-80ba-38aa66429a03',
label: 'Add to favorites',
shortLabel: null,
icon: 'IconHeart',
position: 9,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'arrayLength(favoriteRecordIds) < numberOfSelectedRecords and noneDefined(selectedRecords, "deletedAt") and not hasAnySoftDeleteFilterOnView',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.addToFavorites.universalIdentifier,
},
removeFromFavorites: {
universalIdentifier: '3ea42507-44fa-4895-a36d-cbfef7355a50',
label: 'Remove from favorites',
shortLabel: null,
icon: 'IconHeartOff',
position: 10,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'arrayLength(favoriteRecordIds) == numberOfSelectedRecords and noneDefined(selectedRecords, "deletedAt") and not hasAnySoftDeleteFilterOnView',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.removeFromFavorites.universalIdentifier,
},
exportNoteToPdf: {
universalIdentifier: '86c8f3aa-9276-4c16-8cff-e295e34fbaf0',
label: 'Export to PDF',
shortLabel: 'Export',
icon: 'IconFileExport',
position: 11,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and (objectMetadataItem.nameSingular == "note" or objectMetadataItem.nameSingular == "task") and someNonEmptyString(selectedRecords, "bodyV2.blocknote")',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.exportNoteToPdf.universalIdentifier,
},
exportFromRecordIndex: {
universalIdentifier: 'a934ba8a-ac8f-487d-9cd9-06dfdaec1f49',
label: 'Export',
shortLabel: 'Export',
icon: 'IconFileExport',
position: 12,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: 'pageType == "INDEX_PAGE"',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.exportFromRecordIndex.universalIdentifier,
},
exportFromRecordShow: {
universalIdentifier: 'ba339455-f3c2-4ed1-bf77-3e316d7d6a66',
label: 'Export',
shortLabel: 'Export',
icon: 'IconFileExport',
position: 13,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: 'pageType == "RECORD_PAGE"',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.exportFromRecordShow.universalIdentifier,
},
updateMultipleRecords: {
universalIdentifier: '2e080651-f098-4a78-bea9-7a70002dc57c',
label: 'Update records',
shortLabel: 'Update',
icon: 'IconEdit',
position: 14,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords >= 2 and objectPermissions.canUpdateObjectRecords',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.updateMultipleRecords.universalIdentifier,
},
mergeMultipleRecords: {
universalIdentifier: '6c14eb04-8e7e-4d47-93c0-8ec4834e2e60',
label: 'Merge records',
shortLabel: 'Merge',
icon: 'IconArrowMerge',
position: 15,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'numberOfSelectedRecords >= 2 and isDefined(objectMetadataItem.duplicateCriteria) and objectPermissions.canUpdateObjectRecords and objectPermissions.canDestroyObjectRecords and numberOfSelectedRecords <= 9',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.mergeMultipleRecords.universalIdentifier,
},
exportMultipleRecords: {
universalIdentifier: 'f71f68e5-7b6e-4c03-8161-c48434d7777c',
label: 'Export records',
shortLabel: 'Export',
icon: 'IconFileExport',
position: 16,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: 'numberOfSelectedRecords >= 2',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.exportMultipleRecords.universalIdentifier,
},
importRecords: {
universalIdentifier: 'a2dc9de7-4798-422e-bb55-bfad7b9bdbe8',
label: 'Import records',
shortLabel: 'Import',
icon: 'IconFileImport',
position: 17,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'not hasAnySoftDeleteFilterOnView',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.importRecords.universalIdentifier,
},
exportView: {
universalIdentifier: '80680f2a-c426-48b3-a839-c63a6183dc4b',
label: 'Export view',
shortLabel: 'Export',
icon: 'IconFileExport',
position: 18,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.exportView.universalIdentifier,
},
seeDeletedRecords: {
universalIdentifier: 'd63c21c3-9785-4750-be87-5f36269b8e0d',
label: 'See deleted records',
shortLabel: 'Deleted records',
icon: 'IconRotate2',
position: 19,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'not hasAnySoftDeleteFilterOnView',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeDeletedRecords.universalIdentifier,
},
createNewView: {
universalIdentifier: '6ec7c339-e167-431d-bec6-d1c737df677c',
label: 'Create View',
shortLabel: 'Create View',
icon: 'IconLayout',
position: 20,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'not hasAnySoftDeleteFilterOnView',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.createNewView.universalIdentifier,
},
hideDeletedRecords: {
universalIdentifier: '1420db7f-0fba-49e2-b23e-4b7caa0fafa0',
label: 'Hide deleted records',
shortLabel: 'Hide deleted',
icon: 'IconEyeOff',
position: 21,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'hasAnySoftDeleteFilterOnView',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.hideDeletedRecords.universalIdentifier,
},
goToPeople: {
universalIdentifier: 'dfe5fef8-d42c-40f0-941f-8e3b5eb01daa',
label: 'Go to People',
shortLabel: 'People',
icon: 'IconUser',
position: 23,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'targetObjectReadPermissions.person',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToPeople.universalIdentifier,
},
goToCompanies: {
universalIdentifier: '196e4eec-bfdd-48a6-bcbb-6707ef11951a',
label: 'Go to Companies',
shortLabel: 'Companies',
icon: 'IconBuildingSkyscraper',
position: 24,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'targetObjectReadPermissions.company',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToCompanies.universalIdentifier,
},
goToDashboards: {
universalIdentifier: '11dc07d1-21b2-4f86-af8c-6a664c02f00c',
label: 'Go to Dashboards',
shortLabel: 'Dashboards',
icon: 'IconLayoutDashboard',
position: 25,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'targetObjectReadPermissions.dashboard',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToDashboards.universalIdentifier,
},
goToOpportunities: {
universalIdentifier: 'f04f5e00-a208-422f-acf2-ff189769510d',
label: 'Go to Opportunities',
shortLabel: 'Opportunities',
icon: 'IconTargetArrow',
position: 26,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression:
'targetObjectReadPermissions.opportunity',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToOpportunities.universalIdentifier,
},
goToSettings: {
universalIdentifier: 'ef9aba44-0068-453e-930a-f8c182af18ee',
label: 'Go to Settings',
shortLabel: 'Settings',
icon: 'IconSettings',
position: 27,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToSettings.universalIdentifier,
},
goToTasks: {
universalIdentifier: 'e8e3bd0b-5ce9-4577-bb61-588c0b1ad063',
label: 'Go to Tasks',
shortLabel: 'Tasks',
icon: 'IconCheckbox',
position: 28,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'targetObjectReadPermissions.task',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToTasks.universalIdentifier,
},
goToNotes: {
universalIdentifier: '08e0f0cc-ac2d-46cd-9bca-39a409b9addf',
label: 'Go to Notes',
shortLabel: 'Notes',
icon: 'IconCheckbox',
position: 29,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'targetObjectReadPermissions.note',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToNotes.universalIdentifier,
},
editRecordPageLayout: {
universalIdentifier: 'd9794c67-1799-424f-8871-5ea771dd4a6d',
label: 'Edit Page Layout',
shortLabel: 'Edit Layout',
icon: 'IconPencil',
position: 30,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and featureFlags.IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED and noneDefined(selectedRecords, "deletedAt") and objectPermissions.canUpdateObjectRecords and objectMetadataItem.nameSingular != "dashboard"',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.editRecordPageLayout.universalIdentifier,
},
saveRecordPageLayout: {
universalIdentifier: 'a3363589-e2a6-4451-a53c-b8c2710785e2',
label: 'Save Page Layout',
shortLabel: 'Save',
icon: 'IconDeviceFloppy',
position: 31,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and isPageInEditMode and featureFlags.IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED and noneDefined(selectedRecords, "deletedAt") and objectPermissions.canUpdateObjectRecords',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.saveRecordPageLayout.universalIdentifier,
},
cancelRecordPageLayout: {
universalIdentifier: '0b9b4e93-2b4e-4ab0-908e-83ed1d674df7',
label: 'Cancel Edition',
shortLabel: 'Cancel',
icon: 'IconCancel',
position: 32,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and isPageInEditMode and featureFlags.IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED and noneDefined(selectedRecords, "deletedAt") and objectPermissions.canUpdateObjectRecords',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.cancelRecordPageLayout.universalIdentifier,
},
editDashboardLayout: {
universalIdentifier: 'b9b53bbc-3129-4eb9-8344-c3f9628ffa7d',
label: 'Edit Dashboard',
shortLabel: 'Edit',
icon: 'IconPencil',
position: 33,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and noneDefined(selectedRecords, "deletedAt") and everyDefined(selectedRecords, "pageLayoutId") and objectPermissions.canUpdateObjectRecords',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.dashboard.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.editDashboardLayout.universalIdentifier,
},
saveDashboardLayout: {
universalIdentifier: '18b23908-f816-42ab-bc0a-eb5fae29c695',
label: 'Save Dashboard',
shortLabel: 'Save',
icon: 'IconDeviceFloppy',
position: 34,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and isPageInEditMode and noneDefined(selectedRecords, "deletedAt") and everyDefined(selectedRecords, "pageLayoutId") and objectPermissions.canUpdateObjectRecords',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.dashboard.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.saveDashboardLayout.universalIdentifier,
},
cancelDashboardLayout: {
universalIdentifier: '030ecd01-0aaf-4e6d-8400-105996548887',
label: 'Cancel Edition',
shortLabel: 'Cancel',
icon: 'IconCancel',
position: 35,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and isPageInEditMode and noneDefined(selectedRecords, "deletedAt") and everyDefined(selectedRecords, "pageLayoutId") and objectPermissions.canUpdateObjectRecords',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.dashboard.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.cancelDashboardLayout.universalIdentifier,
},
duplicateDashboard: {
universalIdentifier: '2ee07307-60ce-41ef-bfee-7c718f67557e',
label: 'Duplicate Dashboard',
shortLabel: 'Duplicate',
icon: 'IconCopyPlus',
position: 36,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'noneDefined(selectedRecords, "deletedAt") and objectPermissions.canUpdateObjectRecords',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.dashboard.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.duplicateDashboard.universalIdentifier,
},
goToWorkflows: {
universalIdentifier: '4fa778f9-7931-4d18-b895-929e1ef9c31f',
label: 'Go to Workflows',
shortLabel: 'Workflows',
icon: 'IconSettingsAutomation',
position: 41,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: 'targetObjectReadPermissions.workflow',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToWorkflows.universalIdentifier,
},
activateWorkflow: {
universalIdentifier: '44f19c85-0fd0-482f-a14e-da513c60b1b3',
label: 'Activate Workflow',
shortLabel: 'Activate',
icon: 'IconPower',
position: 42,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'everyDefined(selectedRecords, "currentVersion.trigger") and everyDefined(selectedRecords, "currentVersion.steps") and every(selectedRecords, "currentVersion.steps.length") and (everyEquals(selectedRecords, "currentVersion.status", "DRAFT") or includesNone(selectedRecords, "statuses", "ACTIVE")) and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.activateWorkflow.universalIdentifier,
},
deactivateWorkflow: {
universalIdentifier: '57f21a06-a17a-47b1-a123-90d90dbdf0b7',
label: 'Deactivate Workflow',
shortLabel: 'Deactivate',
icon: 'IconPlayerPause',
position: 43,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'everyEquals(selectedRecords, "currentVersion.status", "ACTIVE") and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.deactivateWorkflow.universalIdentifier,
},
discardDraftWorkflow: {
universalIdentifier: '4c227f2e-03bb-4a66-9b13-49f263264f4a',
label: 'Discard Draft',
shortLabel: 'Discard Draft',
icon: 'IconNoteOff',
position: 44,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'every(selectedRecords, "versions.length") and everyEquals(selectedRecords, "currentVersion.status", "DRAFT") and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.discardDraftWorkflow.universalIdentifier,
},
testWorkflow: {
universalIdentifier: 'f85d552a-87a3-4667-99f7-71b47917539c',
label: 'Test Workflow',
shortLabel: 'Test',
icon: 'IconPlayerPlay',
position: 45,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'everyDefined(selectedRecords, "currentVersion.trigger") and everyDefined(selectedRecords, "currentVersion.steps") and every(selectedRecords, "currentVersion.steps.length") and ((everyEquals(selectedRecords, "currentVersion.trigger.type", "MANUAL") and noneDefined(selectedRecords, "currentVersion.trigger.settings.objectType")) or everyEquals(selectedRecords, "currentVersion.trigger.type", "WEBHOOK") or everyEquals(selectedRecords, "currentVersion.trigger.type", "CRON")) and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.testWorkflow.universalIdentifier,
},
seeActiveVersionWorkflow: {
universalIdentifier: '31790508-75ff-4e4c-a768-83bd1b0718e0',
label: 'See active version',
shortLabel: 'See active version',
icon: 'IconVersions',
position: 46,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'includesEvery(selectedRecords, "statuses", "ACTIVE") and includesEvery(selectedRecords, "statuses", "DRAFT") and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeActiveVersionWorkflow.universalIdentifier,
},
seeRunsWorkflow: {
universalIdentifier: 'e57efc2d-00a2-493a-b76c-f2dabd23a5eb',
label: 'See runs',
shortLabel: 'See runs',
icon: 'IconHistoryToggle',
position: 47,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeRunsWorkflow.universalIdentifier,
},
seeVersionsWorkflow: {
universalIdentifier: '92781d24-b875-4282-8cdb-d127f04a5c7d',
label: 'See versions history',
shortLabel: 'See versions',
icon: 'IconVersions',
position: 48,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeVersionsWorkflow.universalIdentifier,
},
addNodeWorkflow: {
universalIdentifier: '818117fa-6cad-4ebc-83c1-40f4afc28d94',
label: 'Add a node',
shortLabel: 'Add a node',
icon: 'IconPlus',
position: 49,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and everyDefined(selectedRecords, "currentVersion.trigger") and everyDefined(selectedRecords, "currentVersion.steps") and every(selectedRecords, "currentVersion.steps.length") and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.addNodeWorkflow.universalIdentifier,
},
tidyUpWorkflow: {
universalIdentifier: '1f3a3cab-161a-4775-af47-11be4d0bf411',
label: 'Tidy up workflow',
shortLabel: 'Tidy up',
icon: 'IconReorder',
position: 50,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'pageType == "RECORD_PAGE" and everyDefined(selectedRecords, "currentVersion.trigger") and everyDefined(selectedRecords, "currentVersion.steps") and every(selectedRecords, "currentVersion.steps.length") and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.tidyUpWorkflow.universalIdentifier,
},
duplicateWorkflow: {
universalIdentifier: '91094438-b4c2-46ad-a23b-8af4b23ba514',
label: 'Duplicate Workflow',
shortLabel: 'Duplicate',
icon: 'IconCopy',
position: 51,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'everyDefined(selectedRecords, "currentVersion") and noneDefined(selectedRecords, "deletedAt")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflow.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.duplicateWorkflow.universalIdentifier,
},
goToRuns: {
universalIdentifier: '1ba959da-ff49-4c1f-a517-2b78ee200508',
label: 'Go to runs',
shortLabel: 'See runs',
icon: 'IconHistoryToggle',
position: 52,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression:
'not hasAnySoftDeleteFilterOnView and objectMetadataItem.nameSingular != "workflowRun" and objectMetadataItem.nameSingular != "workflowVersion" and objectMetadataItem.nameSingular != "workflow"',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.goToRuns.universalIdentifier,
},
seeVersionWorkflowRun: {
universalIdentifier: 'cc3a065c-c89e-40ac-9449-4272c55b1bb8',
label: 'See version',
shortLabel: 'See version',
icon: 'IconVersions',
position: 53,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflowRun.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeVersionWorkflowRun.universalIdentifier,
},
seeWorkflowWorkflowRun: {
universalIdentifier: '9d9cc62d-3543-45c3-93f3-23d2d8979f2b',
label: 'See workflow',
shortLabel: 'See workflow',
icon: 'IconSettingsAutomation',
position: 54,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflowRun.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeWorkflowWorkflowRun.universalIdentifier,
},
stopWorkflowRun: {
universalIdentifier: '4c186606-9515-4561-a1eb-9a072b4f5e58',
label: 'Stop',
shortLabel: 'Stop',
icon: 'IconPlayerStop',
position: 55,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'isSelectAll or someEquals(selectedRecords, "status", "NOT_STARTED") or someEquals(selectedRecords, "status", "ENQUEUED") or someEquals(selectedRecords, "status", "RUNNING")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflowRun.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.stopWorkflowRun.universalIdentifier,
},
seeRunsWorkflowVersion: {
universalIdentifier: '44e305c7-4f0a-45ec-803f-6471b56455cb',
label: 'See runs',
shortLabel: 'See runs',
icon: 'IconHistoryToggle',
position: 56,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'everyDefined(selectedRecords, "workflow")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflowVersion.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeRunsWorkflowVersion.universalIdentifier,
},
seeWorkflowWorkflowVersion: {
universalIdentifier: 'b43052db-023e-4083-9b63-2c2dfbfd1320',
label: 'See workflow',
shortLabel: 'See workflow',
icon: 'IconSettingsAutomation',
position: 57,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'everyDefined(selectedRecords, "workflow.id")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflowVersion.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeWorkflowWorkflowVersion.universalIdentifier,
},
useAsDraftWorkflowVersion: {
universalIdentifier: '483c0c1d-ea4d-4a4d-8a59-2dcf9f8e38f6',
label: 'Use as draft',
shortLabel: 'Use as draft',
icon: 'IconPencil',
position: 58,
isPinned: true,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'noneEquals(selectedRecords, "status", "DRAFT")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflowVersion.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.useAsDraftWorkflowVersion.universalIdentifier,
},
seeVersionsWorkflowVersion: {
universalIdentifier: '1d4abeb7-2750-4af7-9a92-fbadd2a9e4ba',
label: 'See versions history',
shortLabel: 'See versions',
icon: 'IconVersions',
position: 59,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression:
'everyDefined(selectedRecords, "workflow")',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.workflowVersion.universalIdentifier,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.seeVersionsWorkflowVersion.universalIdentifier,
},
searchRecords: {
universalIdentifier: 'fa24e25e-68f8-4548-82ff-c7b5168b7c7d',
label: 'Search records',
shortLabel: 'Search',
icon: 'IconSearch',
position: 60,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.searchRecords.universalIdentifier,
},
searchRecordsFallback: {
universalIdentifier: 'c659890c-7266-46c9-bfe1-75cefff8b6d0',
label: 'Search records',
shortLabel: 'Search',
icon: 'IconSearch',
position: 61,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.FALLBACK,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.searchRecordsFallback.universalIdentifier,
},
askAi: {
universalIdentifier: 'ce5fb54d-2b19-4dd1-b7b4-9532a1761a41',
label: 'Ask AI',
shortLabel: 'Ask AI',
icon: 'IconSparkles',
position: 62,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.askAi.universalIdentifier,
},
viewPreviousAiChats: {
universalIdentifier: '3084c3c9-cc23-4dad-9e00-92025f5cba7a',
label: 'View Previous AI Chats',
shortLabel: 'Previous AI Chats',
icon: 'IconHistory',
position: 63,
isPinned: false,
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier:
STANDARD_FRONT_COMPONENTS.viewPreviousAiChats.universalIdentifier,
},
} as const;
@@ -0,0 +1,808 @@
import { STANDARD_FRONT_COMPONENT_BUILD_MANIFEST } from 'twenty-standard-application';
export const STANDARD_FRONT_COMPONENTS = {
navigateToNextRecord: {
universalIdentifier: 'aec12b85-29df-465f-a329-1c72c81ed95c',
name: 'Navigate to next record',
componentName: 'NavigateToNextRecord',
sourceComponentPath:
'front-components/record/navigate-to-next-record.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.navigateToNextRecord
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.navigateToNextRecord
.builtComponentChecksum,
isHeadless: true,
},
navigateToPreviousRecord: {
universalIdentifier: 'b53c54b9-152a-4100-975c-1bc582bfb951',
name: 'Navigate to previous record',
componentName: 'NavigateToPreviousRecord',
sourceComponentPath:
'front-components/record/navigate-to-previous-record.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.navigateToPreviousRecord
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.navigateToPreviousRecord
.builtComponentChecksum,
isHeadless: true,
},
createNewRecord: {
universalIdentifier: '1e6e57bb-89c4-482e-bf44-d62ad1c05d2f',
name: 'Create new record',
componentName: 'CreateNewRecord',
sourceComponentPath:
'front-components/record/create-new-record.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.createNewRecord
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.createNewRecord
.builtComponentChecksum,
isHeadless: true,
},
deleteSingleRecord: {
universalIdentifier: 'cbc7e92f-d4fe-4956-ba66-a81b7f9713c6',
name: 'Delete single record',
componentName: 'DeleteSingleRecord',
sourceComponentPath:
'front-components/record/delete-single-record.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.deleteSingleRecord
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.deleteSingleRecord
.builtComponentChecksum,
isHeadless: true,
},
deleteMultipleRecords: {
universalIdentifier: '35c25fd2-6060-440a-b734-aa3016c11f47',
name: 'Delete multiple records',
componentName: 'DeleteMultipleRecords',
sourceComponentPath:
'front-components/record/delete-multiple-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.deleteMultipleRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.deleteMultipleRecords
.builtComponentChecksum,
isHeadless: true,
},
restoreSingleRecord: {
universalIdentifier: '88262225-1253-4dfe-9bf7-563b73e6d9ea',
name: 'Restore single record',
componentName: 'RestoreSingleRecord',
sourceComponentPath:
'front-components/record/restore-single-record.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.restoreSingleRecord
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.restoreSingleRecord
.builtComponentChecksum,
isHeadless: true,
},
restoreMultipleRecords: {
universalIdentifier: '105ff959-838c-44bc-8a92-60d61093ebc4',
name: 'Restore multiple records',
componentName: 'RestoreMultipleRecords',
sourceComponentPath:
'front-components/record/restore-multiple-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.restoreMultipleRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.restoreMultipleRecords
.builtComponentChecksum,
isHeadless: true,
},
destroySingleRecord: {
universalIdentifier: '212d9e7d-e149-417b-9a0f-5024835349e6',
name: 'Destroy single record',
componentName: 'DestroySingleRecord',
sourceComponentPath:
'front-components/record/destroy-single-record.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.destroySingleRecord
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.destroySingleRecord
.builtComponentChecksum,
isHeadless: true,
},
destroyMultipleRecords: {
universalIdentifier: 'f647d17d-b4ae-4a4c-99a9-4e5e4e3068a2',
name: 'Destroy multiple records',
componentName: 'DestroyMultipleRecords',
sourceComponentPath:
'front-components/record/destroy-multiple-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.destroyMultipleRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.destroyMultipleRecords
.builtComponentChecksum,
isHeadless: true,
},
addToFavorites: {
universalIdentifier: '5694b053-1f42-416c-a26a-375f826aa9b3',
name: 'Add to favorites',
componentName: 'AddToFavorites',
sourceComponentPath:
'front-components/record/add-to-favorites.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.addToFavorites.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.addToFavorites
.builtComponentChecksum,
isHeadless: true,
},
removeFromFavorites: {
universalIdentifier: '21105d6a-33a2-4ae3-8edb-c33c38d2e091',
name: 'Remove from favorites',
componentName: 'RemoveFromFavorites',
sourceComponentPath:
'front-components/record/remove-from-favorites.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.removeFromFavorites
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.removeFromFavorites
.builtComponentChecksum,
isHeadless: true,
},
exportNoteToPdf: {
universalIdentifier: '980399e9-e530-4430-bf47-7f3f482434b4',
name: 'Export note to PDF',
componentName: 'ExportNoteToPdf',
sourceComponentPath:
'front-components/record/export-note-to-pdf.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportNoteToPdf
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportNoteToPdf
.builtComponentChecksum,
isHeadless: true,
},
exportFromRecordIndex: {
universalIdentifier: '6aca9ecc-b419-453d-8243-6d19faa8c8a7',
name: 'Export from record index',
componentName: 'ExportFromRecordIndex',
sourceComponentPath:
'front-components/record/export-from-record-index.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportFromRecordIndex
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportFromRecordIndex
.builtComponentChecksum,
isHeadless: true,
},
exportFromRecordShow: {
universalIdentifier: '74d8f880-1be1-432e-b475-8970deed809e',
name: 'Export from record show',
componentName: 'ExportFromRecordShow',
sourceComponentPath:
'front-components/record/export-from-record-show.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportFromRecordShow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportFromRecordShow
.builtComponentChecksum,
isHeadless: true,
},
updateMultipleRecords: {
universalIdentifier: 'f89c3e6b-6d96-4103-8cfc-4de6017a75c0',
name: 'Update multiple records',
componentName: 'UpdateMultipleRecords',
sourceComponentPath:
'front-components/record/update-multiple-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.updateMultipleRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.updateMultipleRecords
.builtComponentChecksum,
isHeadless: true,
},
mergeMultipleRecords: {
universalIdentifier: '9c6757aa-ecdd-4b21-8466-fb1e8f0bfcb8',
name: 'Merge multiple records',
componentName: 'MergeMultipleRecords',
sourceComponentPath:
'front-components/record/merge-multiple-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.mergeMultipleRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.mergeMultipleRecords
.builtComponentChecksum,
isHeadless: true,
},
exportMultipleRecords: {
universalIdentifier: '05381918-8c9c-421f-ab89-10e365a463f8',
name: 'Export multiple records',
componentName: 'ExportMultipleRecords',
sourceComponentPath:
'front-components/record/export-multiple-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportMultipleRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportMultipleRecords
.builtComponentChecksum,
isHeadless: true,
},
importRecords: {
universalIdentifier: 'acfd8025-36d1-4a35-9508-a0422e53d380',
name: 'Import records',
componentName: 'ImportRecords',
sourceComponentPath:
'front-components/record/import-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.importRecords.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.importRecords
.builtComponentChecksum,
isHeadless: true,
},
exportView: {
universalIdentifier: '012dc64f-ad2b-419a-98ea-d0019ff3d56d',
name: 'Export view',
componentName: 'ExportView',
sourceComponentPath:
'front-components/record/export-view.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportView.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.exportView.builtComponentChecksum,
isHeadless: true,
},
seeDeletedRecords: {
universalIdentifier: 'dad2327b-9020-4d13-a38c-14d1207e66fc',
name: 'See deleted records',
componentName: 'SeeDeletedRecords',
sourceComponentPath:
'front-components/record/see-deleted-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeDeletedRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeDeletedRecords
.builtComponentChecksum,
isHeadless: true,
},
createNewView: {
universalIdentifier: 'd7bf58ad-e716-47c1-8c51-209c755c5f27',
name: 'Create view',
componentName: 'CreateNewView',
sourceComponentPath:
'front-components/record/create-new-view.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.createNewView.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.createNewView
.builtComponentChecksum,
isHeadless: true,
},
hideDeletedRecords: {
universalIdentifier: '75e93e21-effb-48ef-ba1c-588c358fd56f',
name: 'Hide deleted records',
componentName: 'HideDeletedRecords',
sourceComponentPath:
'front-components/record/hide-deleted-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.hideDeletedRecords
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.hideDeletedRecords
.builtComponentChecksum,
isHeadless: true,
},
goToPeople: {
universalIdentifier: '5a5c1e43-9fb5-49bf-bcde-355973f913b9',
name: 'Go to People',
componentName: 'GoToPeople',
sourceComponentPath:
'front-components/navigation/go-to-people.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToPeople.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToPeople.builtComponentChecksum,
isHeadless: true,
},
goToCompanies: {
universalIdentifier: '22ac113b-fe7d-41de-b06f-d863964bc445',
name: 'Go to Companies',
componentName: 'GoToCompanies',
sourceComponentPath:
'front-components/navigation/go-to-companies.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToCompanies.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToCompanies
.builtComponentChecksum,
isHeadless: true,
},
goToDashboards: {
universalIdentifier: 'c71cc879-50af-4e20-9bdc-52f90c9862ed',
name: 'Go to Dashboards',
componentName: 'GoToDashboards',
sourceComponentPath:
'front-components/navigation/go-to-dashboards.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToDashboards.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToDashboards
.builtComponentChecksum,
isHeadless: true,
},
goToOpportunities: {
universalIdentifier: 'ebb4c2ca-6b70-4d2e-8919-79475a278273',
name: 'Go to Opportunities',
componentName: 'GoToOpportunities',
sourceComponentPath:
'front-components/navigation/go-to-opportunities.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToOpportunities
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToOpportunities
.builtComponentChecksum,
isHeadless: true,
},
goToSettings: {
universalIdentifier: '1fb7b785-b79a-42b7-aff2-e57fe1d74e35',
name: 'Go to Settings',
componentName: 'GoToSettings',
sourceComponentPath:
'front-components/navigation/go-to-settings.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToSettings.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToSettings
.builtComponentChecksum,
isHeadless: true,
},
goToTasks: {
universalIdentifier: 'c08ff958-141d-4892-8737-1faf6b630a2b',
name: 'Go to Tasks',
componentName: 'GoToTasks',
sourceComponentPath:
'front-components/navigation/go-to-tasks.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToTasks.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToTasks.builtComponentChecksum,
isHeadless: true,
},
goToNotes: {
universalIdentifier: 'd32f7962-e8e1-46d6-856c-ccc71e71d50c',
name: 'Go to Notes',
componentName: 'GoToNotes',
sourceComponentPath:
'front-components/navigation/go-to-notes.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToNotes.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToNotes.builtComponentChecksum,
isHeadless: true,
},
editRecordPageLayout: {
universalIdentifier: 'd1a8a4c5-2644-4d4b-b684-64625a700760',
name: 'Edit record page layout',
componentName: 'EditRecordPageLayout',
sourceComponentPath:
'front-components/page-layout/edit-record-page-layout.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.editRecordPageLayout
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.editRecordPageLayout
.builtComponentChecksum,
isHeadless: true,
},
saveRecordPageLayout: {
universalIdentifier: '7956ba3a-fd4d-466e-96b5-9e3e8b637c44',
name: 'Save record page layout',
componentName: 'SaveRecordPageLayout',
sourceComponentPath:
'front-components/page-layout/save-record-page-layout.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.saveRecordPageLayout
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.saveRecordPageLayout
.builtComponentChecksum,
isHeadless: true,
},
cancelRecordPageLayout: {
universalIdentifier: 'd392762b-4c42-4471-9c45-c92e66728380',
name: 'Cancel record page layout edition',
componentName: 'CancelRecordPageLayout',
sourceComponentPath:
'front-components/page-layout/cancel-record-page-layout.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.cancelRecordPageLayout
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.cancelRecordPageLayout
.builtComponentChecksum,
isHeadless: true,
},
editDashboardLayout: {
universalIdentifier: '8a87b33b-f196-414c-a60a-16402aa0b57f',
name: 'Edit dashboard layout',
componentName: 'EditDashboardLayout',
sourceComponentPath:
'front-components/dashboard/edit-dashboard-layout.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.editDashboardLayout
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.editDashboardLayout
.builtComponentChecksum,
isHeadless: true,
},
saveDashboardLayout: {
universalIdentifier: '5d7b4510-79e8-440f-8707-21741c00d262',
name: 'Save dashboard layout',
componentName: 'SaveDashboardLayout',
sourceComponentPath:
'front-components/dashboard/save-dashboard-layout.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.saveDashboardLayout
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.saveDashboardLayout
.builtComponentChecksum,
isHeadless: true,
},
cancelDashboardLayout: {
universalIdentifier: 'dac81512-3890-4ba5-8471-bd94738ab80a',
name: 'Cancel dashboard layout edition',
componentName: 'CancelDashboardLayout',
sourceComponentPath:
'front-components/dashboard/cancel-dashboard-layout.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.cancelDashboardLayout
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.cancelDashboardLayout
.builtComponentChecksum,
isHeadless: true,
},
duplicateDashboard: {
universalIdentifier: 'e2bec30e-a6b0-47ff-9708-45855ae96fe7',
name: 'Duplicate dashboard',
componentName: 'DuplicateDashboard',
sourceComponentPath:
'front-components/dashboard/duplicate-dashboard.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.duplicateDashboard
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.duplicateDashboard
.builtComponentChecksum,
isHeadless: true,
},
goToWorkflows: {
universalIdentifier: '9d313f79-170f-47cc-b9c4-a2076a86232f',
name: 'Go to Workflows',
componentName: 'GoToWorkflows',
sourceComponentPath:
'front-components/navigation/go-to-workflows.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToWorkflows.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToWorkflows
.builtComponentChecksum,
isHeadless: true,
},
activateWorkflow: {
universalIdentifier: '97b89dc4-cef9-4439-9358-35c98616eb1e',
name: 'Activate workflow',
componentName: 'ActivateWorkflow',
sourceComponentPath:
'front-components/workflow/activate-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.activateWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.activateWorkflow
.builtComponentChecksum,
isHeadless: true,
},
deactivateWorkflow: {
universalIdentifier: 'cbf92077-1892-47e0-9435-14ea8f50a510',
name: 'Deactivate workflow',
componentName: 'DeactivateWorkflow',
sourceComponentPath:
'front-components/workflow/deactivate-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.deactivateWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.deactivateWorkflow
.builtComponentChecksum,
isHeadless: true,
},
discardDraftWorkflow: {
universalIdentifier: '972dc871-7f9c-4035-957c-e6662f4df7c5',
name: 'Discard draft workflow',
componentName: 'DiscardDraftWorkflow',
sourceComponentPath:
'front-components/workflow/discard-draft-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.discardDraftWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.discardDraftWorkflow
.builtComponentChecksum,
isHeadless: true,
},
testWorkflow: {
universalIdentifier: '39e9aa5a-cacc-4543-9053-f1fbf923e170',
name: 'Test workflow',
componentName: 'TestWorkflow',
sourceComponentPath:
'front-components/workflow/test-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.testWorkflow.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.testWorkflow
.builtComponentChecksum,
isHeadless: true,
},
seeActiveVersionWorkflow: {
universalIdentifier: '6259a4a5-428e-41b9-a032-333c2d51e15f',
name: 'See active version',
componentName: 'SeeActiveVersionWorkflow',
sourceComponentPath:
'front-components/workflow/see-active-version-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeActiveVersionWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeActiveVersionWorkflow
.builtComponentChecksum,
isHeadless: true,
},
seeRunsWorkflow: {
universalIdentifier: 'b8fa3327-e5c4-43f4-a3ac-c17d26af0847',
name: 'See runs',
componentName: 'SeeRunsWorkflow',
sourceComponentPath:
'front-components/workflow/see-runs-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeRunsWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeRunsWorkflow
.builtComponentChecksum,
isHeadless: true,
},
seeVersionsWorkflow: {
universalIdentifier: '62f41c00-629f-400d-85f8-d532d76c7879',
name: 'See versions history',
componentName: 'SeeVersionsWorkflow',
sourceComponentPath:
'front-components/workflow/see-versions-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeVersionsWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeVersionsWorkflow
.builtComponentChecksum,
isHeadless: true,
},
addNodeWorkflow: {
universalIdentifier: 'da1e499c-1298-4ec4-9a7b-5f2276075888',
name: 'Add a node',
componentName: 'AddNodeWorkflow',
sourceComponentPath:
'front-components/workflow/add-node-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.addNodeWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.addNodeWorkflow
.builtComponentChecksum,
isHeadless: true,
},
tidyUpWorkflow: {
universalIdentifier: '3dac631e-dfb7-4570-ac27-15d98ee8ec43',
name: 'Tidy up workflow',
componentName: 'TidyUpWorkflow',
sourceComponentPath:
'front-components/workflow/tidy-up-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.tidyUpWorkflow.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.tidyUpWorkflow
.builtComponentChecksum,
isHeadless: true,
},
duplicateWorkflow: {
universalIdentifier: '566a48c5-5342-446f-a041-9db59bcdab6b',
name: 'Duplicate workflow',
componentName: 'DuplicateWorkflow',
sourceComponentPath:
'front-components/workflow/duplicate-workflow.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.duplicateWorkflow
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.duplicateWorkflow
.builtComponentChecksum,
isHeadless: true,
},
goToRuns: {
universalIdentifier: '0bd0ccfc-1909-4d19-b694-610878f07a3a',
name: 'Go to runs',
componentName: 'GoToRuns',
sourceComponentPath:
'front-components/navigation/go-to-runs.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToRuns.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.goToRuns.builtComponentChecksum,
isHeadless: true,
},
seeVersionWorkflowRun: {
universalIdentifier: '2e09d6b0-60c3-447c-8d5d-1af70a2d037b',
name: 'See version (workflow run)',
componentName: 'SeeVersionWorkflowRun',
sourceComponentPath:
'front-components/workflow-run/see-version-workflow-run.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeVersionWorkflowRun
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeVersionWorkflowRun
.builtComponentChecksum,
isHeadless: true,
},
seeWorkflowWorkflowRun: {
universalIdentifier: '88a80460-6e2f-4587-8a04-a67d894fdf69',
name: 'See workflow (workflow run)',
componentName: 'SeeWorkflowWorkflowRun',
sourceComponentPath:
'front-components/workflow-run/see-workflow-workflow-run.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeWorkflowWorkflowRun
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeWorkflowWorkflowRun
.builtComponentChecksum,
isHeadless: true,
},
stopWorkflowRun: {
universalIdentifier: '110fb676-2a09-4ac0-bd19-7261bc588967',
name: 'Stop workflow run',
componentName: 'StopWorkflowRun',
sourceComponentPath:
'front-components/workflow-run/stop-workflow-run.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.stopWorkflowRun
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.stopWorkflowRun
.builtComponentChecksum,
isHeadless: true,
},
seeRunsWorkflowVersion: {
universalIdentifier: '3d673f94-ecf9-4e38-8eac-684cf4cad617',
name: 'See runs (workflow version)',
componentName: 'SeeRunsWorkflowVersion',
sourceComponentPath:
'front-components/workflow-version/see-runs-workflow-version.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeRunsWorkflowVersion
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeRunsWorkflowVersion
.builtComponentChecksum,
isHeadless: true,
},
seeWorkflowWorkflowVersion: {
universalIdentifier: 'aec002df-0fc1-45ed-8526-9600623ef5f6',
name: 'See workflow (workflow version)',
componentName: 'SeeWorkflowWorkflowVersion',
sourceComponentPath:
'front-components/workflow-version/see-workflow-workflow-version.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeWorkflowWorkflowVersion
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeWorkflowWorkflowVersion
.builtComponentChecksum,
isHeadless: true,
},
useAsDraftWorkflowVersion: {
universalIdentifier: 'cb11ab5c-974a-4942-bb8a-77efa6b5bb26',
name: 'Use as draft (workflow version)',
componentName: 'UseAsDraftWorkflowVersion',
sourceComponentPath:
'front-components/workflow-version/use-as-draft-workflow-version.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.useAsDraftWorkflowVersion
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.useAsDraftWorkflowVersion
.builtComponentChecksum,
isHeadless: true,
},
seeVersionsWorkflowVersion: {
universalIdentifier: 'a93c9f09-7a7f-4665-982a-0709a652c5bd',
name: 'See versions history (workflow version)',
componentName: 'SeeVersionsWorkflowVersion',
sourceComponentPath:
'front-components/workflow-version/see-versions-workflow-version.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeVersionsWorkflowVersion
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.seeVersionsWorkflowVersion
.builtComponentChecksum,
isHeadless: true,
},
searchRecords: {
universalIdentifier: '7791c67a-e58d-4a2d-9cfd-58110a04cb8f',
name: 'Search records',
componentName: 'SearchRecords',
sourceComponentPath:
'front-components/side-panel/search-records.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.searchRecords.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.searchRecords
.builtComponentChecksum,
isHeadless: true,
},
searchRecordsFallback: {
universalIdentifier: '7f7fc9f2-0291-4264-a789-d21e8f1c774e',
name: 'Search records fallback',
componentName: 'SearchRecordsFallback',
sourceComponentPath:
'front-components/side-panel/search-records-fallback.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.searchRecordsFallback
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.searchRecordsFallback
.builtComponentChecksum,
isHeadless: true,
},
askAi: {
universalIdentifier: '75d8fed0-36d9-4798-afa5-1472ecac0884',
name: 'Ask AI',
componentName: 'AskAi',
sourceComponentPath:
'front-components/side-panel/ask-ai.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.askAi.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.askAi.builtComponentChecksum,
isHeadless: true,
},
viewPreviousAiChats: {
universalIdentifier: '5e7876fa-7a9b-487f-8e05-1a1c7ce029d9',
name: 'View previous AI chats',
componentName: 'ViewPreviousAiChats',
sourceComponentPath:
'front-components/side-panel/view-previous-ai-chats.front-component.tsx',
builtComponentPath:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.viewPreviousAiChats
.builtComponentPath,
builtComponentChecksum:
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST.viewPreviousAiChats
.builtComponentChecksum,
isHeadless: true,
},
} as const;
@@ -16,4 +16,6 @@ export const TWENTY_STANDARD_ALL_METADATA_NAME = [
'pageLayout',
'pageLayoutTab',
'pageLayoutWidget',
'frontComponent',
'commandMenuItem',
] as const satisfies AllMetadataName[];
@@ -0,0 +1,64 @@
import { Injectable, Logger } from '@nestjs/common';
import fs from 'fs';
import path from 'path';
import { FileFolder } from 'twenty-shared/types';
import { STANDARD_FRONT_COMPONENT_BUILD_MANIFEST } from 'twenty-standard-application';
import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
const BUILT_FRONT_COMPONENTS_PATH = path.resolve(
path.dirname(require.resolve('twenty-standard-application/package.json')),
'src/build',
);
@Injectable()
export class StandardFrontComponentUploadService {
private readonly logger = new Logger(
StandardFrontComponentUploadService.name,
);
constructor(private readonly fileStorageService: FileStorageService) {}
async uploadBuiltFrontComponents({
workspaceId,
}: {
workspaceId: string;
}): Promise<void> {
const applicationUniversalIdentifier =
TWENTY_STANDARD_APPLICATION.universalIdentifier;
const manifestEntries = Object.values(
STANDARD_FRONT_COMPONENT_BUILD_MANIFEST,
);
for (const entry of manifestEntries) {
const localFilePath = path.join(
BUILT_FRONT_COMPONENTS_PATH,
entry.builtComponentPath,
);
if (!fs.existsSync(localFilePath)) {
this.logger.warn(
`Built front component file not found: ${localFilePath}`,
);
continue;
}
const fileContent = fs.readFileSync(localFilePath);
await this.fileStorageService.writeFile({
sourceFile: fileContent,
mimeType: 'application/javascript',
fileFolder: FileFolder.BuiltFrontComponent,
applicationUniversalIdentifier,
workspaceId,
resourcePath: entry.builtComponentPath,
settings: { isTemporaryFile: false, toDelete: false },
});
}
}
}
@@ -14,6 +14,7 @@ import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspac
import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util';
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
import { TWENTY_STANDARD_ALL_METADATA_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant';
import { StandardFrontComponentUploadService } from 'src/engine/workspace-manager/twenty-standard-application/services/standard-front-component-upload.service';
import { computeTwentyStandardApplicationAllFlatEntityMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant';
import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception';
import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service';
@@ -29,6 +30,7 @@ export class TwentyStandardApplicationService {
private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService,
private readonly workspaceCacheService: WorkspaceCacheService,
private readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager,
private readonly standardFrontComponentUploadService: StandardFrontComponentUploadService,
) {}
// Note: To remove and handle natively in validateBuildAndRun after favorite migration to metadata
@@ -74,6 +76,11 @@ export class TwentyStandardApplicationService {
...TWENTY_STANDARD_ALL_METADATA_NAME.map(getMetadataFlatEntityMapsKey),
'featureFlagsMap',
]);
await this.standardFrontComponentUploadService.uploadBuiltFrontComponents({
workspaceId,
});
const shouldIncludeRecordPageLayouts = this.twentyConfigService.get(
'SHOULD_SEED_STANDARD_RECORD_PAGE_LAYOUTS',
);
@@ -7,10 +7,14 @@ import { GlobalWorkspaceDataSourceModule } from 'src/engine/twenty-orm/global-wo
import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module';
import { WorkspaceMigrationModule } from 'src/engine/workspace-manager/workspace-migration/workspace-migration.module';
import { StandardFrontComponentUploadService } from './services/standard-front-component-upload.service';
import { TwentyStandardApplicationService } from './services/twenty-standard-application.service';
@Module({
providers: [TwentyStandardApplicationService],
providers: [
TwentyStandardApplicationService,
StandardFrontComponentUploadService,
],
imports: [
ApplicationModule,
TwentyConfigModule,
@@ -0,0 +1,53 @@
import { v4 } from 'uuid';
import { type FlatCommandMenuItemMaps } from 'src/engine/metadata-modules/flat-command-menu-item/types/flat-command-menu-item-maps.type';
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { type FlatFrontComponent } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { STANDARD_COMMAND_MENU_ITEMS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-command-menu-item.constant';
import { createStandardCommandMenuItemFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/command-menu-item/create-standard-command-menu-item-flat-metadata.util';
import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util';
const STANDARD_COMMAND_MENU_ITEM_NAMES = Object.keys(
STANDARD_COMMAND_MENU_ITEMS,
) as Array<keyof typeof STANDARD_COMMAND_MENU_ITEMS>;
export const buildStandardFlatCommandMenuItemMaps = ({
now,
workspaceId,
twentyStandardApplicationId,
dependencyFlatEntityMaps: { flatFrontComponentMaps, flatObjectMetadataMaps },
}: {
now: string;
workspaceId: string;
twentyStandardApplicationId: string;
dependencyFlatEntityMaps: {
flatFrontComponentMaps: FlatEntityMaps<FlatFrontComponent>;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
};
}): FlatCommandMenuItemMaps => {
const flatCommandMenuItemMaps: FlatCommandMenuItemMaps =
createEmptyFlatEntityMaps();
for (const commandMenuItemName of STANDARD_COMMAND_MENU_ITEM_NAMES) {
const flatCommandMenuItem = createStandardCommandMenuItemFlatMetadata({
commandMenuItemName,
commandMenuItemId: v4(),
workspaceId,
twentyStandardApplicationId,
dependencyFlatEntityMaps: {
flatFrontComponentMaps,
flatObjectMetadataMaps,
},
now,
});
addFlatEntityToFlatEntityMapsThroughMutationOrThrow({
flatEntity: flatCommandMenuItem,
flatEntityMapsToMutate: flatCommandMenuItemMaps,
});
}
return flatCommandMenuItemMaps;
};
@@ -0,0 +1,87 @@
import { isDefined } from 'twenty-shared/utils';
import { type FlatCommandMenuItem } from 'src/engine/metadata-modules/flat-command-menu-item/types/flat-command-menu-item.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
import { type FlatFrontComponent } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { STANDARD_COMMAND_MENU_ITEMS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-command-menu-item.constant';
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
export const createStandardCommandMenuItemFlatMetadata = ({
commandMenuItemName,
commandMenuItemId,
workspaceId,
twentyStandardApplicationId,
dependencyFlatEntityMaps: { flatFrontComponentMaps, flatObjectMetadataMaps },
now,
}: {
commandMenuItemName: keyof typeof STANDARD_COMMAND_MENU_ITEMS;
commandMenuItemId: string;
workspaceId: string;
twentyStandardApplicationId: string;
dependencyFlatEntityMaps: {
flatFrontComponentMaps: FlatEntityMaps<FlatFrontComponent>;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
};
now: string;
}): FlatCommandMenuItem => {
const definition = STANDARD_COMMAND_MENU_ITEMS[commandMenuItemName];
const flatFrontComponent = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatFrontComponentMaps,
universalIdentifier: definition.frontComponentUniversalIdentifier,
});
if (!isDefined(flatFrontComponent)) {
throw new Error(
`Front component not found for universal identifier ${definition.frontComponentUniversalIdentifier}`,
);
}
let resolvedObjectMetadataId: string | null = null;
let resolvedObjectMetadataUniversalIdentifier: string | null = null;
if (isDefined(definition.availabilityObjectMetadataUniversalIdentifier)) {
const flatObjectMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatObjectMetadataMaps,
universalIdentifier:
definition.availabilityObjectMetadataUniversalIdentifier,
});
if (!isDefined(flatObjectMetadata)) {
throw new Error(
`Object metadata not found for universal identifier ${definition.availabilityObjectMetadataUniversalIdentifier}`,
);
}
resolvedObjectMetadataId = flatObjectMetadata.id;
resolvedObjectMetadataUniversalIdentifier =
flatObjectMetadata.universalIdentifier;
}
return {
id: commandMenuItemId,
universalIdentifier: definition.universalIdentifier,
applicationId: twentyStandardApplicationId,
applicationUniversalIdentifier:
TWENTY_STANDARD_APPLICATION.universalIdentifier,
workspaceId,
label: definition.label,
shortLabel: definition.shortLabel,
icon: definition.icon,
position: definition.position,
isPinned: definition.isPinned,
availabilityType: definition.availabilityType,
conditionalAvailabilityExpression:
definition.conditionalAvailabilityExpression ?? null,
frontComponentId: flatFrontComponent.id,
frontComponentUniversalIdentifier: flatFrontComponent.universalIdentifier,
workflowVersionId: null,
availabilityObjectMetadataId: resolvedObjectMetadataId,
availabilityObjectMetadataUniversalIdentifier:
resolvedObjectMetadataUniversalIdentifier,
createdAt: now,
updatedAt: now,
};
};
@@ -0,0 +1,102 @@
import { isDefined } from 'twenty-shared/utils';
import { type CommandMenuItemAvailabilityType } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity';
import { type FlatCommandMenuItem } from 'src/engine/metadata-modules/flat-command-menu-item/types/flat-command-menu-item.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
import { type FlatFrontComponent } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
export const createStandardCommandMenuItemFolderFlatMetadata = ({
universalIdentifier,
label,
shortLabel,
icon,
position,
isPinned,
availabilityType,
frontComponentUniversalIdentifier,
availabilityObjectMetadataUniversalIdentifier,
conditionalAvailabilityExpression = null,
commandMenuItemId,
workspaceId,
twentyStandardApplicationId,
dependencyFlatEntityMaps: { flatFrontComponentMaps, flatObjectMetadataMaps },
now,
}: {
universalIdentifier: string;
label: string;
shortLabel: string | null;
icon: string;
position: number;
isPinned: boolean;
availabilityType: CommandMenuItemAvailabilityType;
frontComponentUniversalIdentifier: string;
availabilityObjectMetadataUniversalIdentifier: string | null;
conditionalAvailabilityExpression?: string | null;
commandMenuItemId: string;
workspaceId: string;
twentyStandardApplicationId: string;
dependencyFlatEntityMaps: {
flatFrontComponentMaps: FlatEntityMaps<FlatFrontComponent>;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
};
now: string;
}): FlatCommandMenuItem => {
const flatFrontComponent = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatFrontComponentMaps,
universalIdentifier: frontComponentUniversalIdentifier,
});
if (!isDefined(flatFrontComponent)) {
throw new Error(
`Front component not found for universal identifier ${frontComponentUniversalIdentifier}`,
);
}
let resolvedObjectMetadataId: string | null = null;
let resolvedObjectMetadataUniversalIdentifier: string | null = null;
if (isDefined(availabilityObjectMetadataUniversalIdentifier)) {
const flatObjectMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatObjectMetadataMaps,
universalIdentifier: availabilityObjectMetadataUniversalIdentifier,
});
if (!isDefined(flatObjectMetadata)) {
throw new Error(
`Object metadata not found for universal identifier ${availabilityObjectMetadataUniversalIdentifier}`,
);
}
resolvedObjectMetadataId = flatObjectMetadata.id;
resolvedObjectMetadataUniversalIdentifier =
flatObjectMetadata.universalIdentifier;
}
return {
id: commandMenuItemId,
universalIdentifier,
applicationId: twentyStandardApplicationId,
applicationUniversalIdentifier:
TWENTY_STANDARD_APPLICATION.universalIdentifier,
workspaceId,
label,
shortLabel,
icon,
position,
isPinned,
availabilityType,
conditionalAvailabilityExpression:
conditionalAvailabilityExpression ?? null,
frontComponentId: flatFrontComponent.id,
frontComponentUniversalIdentifier: flatFrontComponent.universalIdentifier,
workflowVersionId: null,
availabilityObjectMetadataId: resolvedObjectMetadataId,
availabilityObjectMetadataUniversalIdentifier:
resolvedObjectMetadataUniversalIdentifier,
createdAt: now,
updatedAt: now,
};
};
@@ -0,0 +1,42 @@
import { v4 } from 'uuid';
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
import { type FlatFrontComponentMaps } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component-maps.type';
import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util';
import { STANDARD_FRONT_COMPONENTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-front-component.constant';
import { createStandardFrontComponentFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/front-component/create-standard-front-component-flat-metadata.util';
const STANDARD_FRONT_COMPONENT_NAMES = Object.keys(
STANDARD_FRONT_COMPONENTS,
) as Array<keyof typeof STANDARD_FRONT_COMPONENTS>;
export const buildStandardFlatFrontComponentMaps = ({
now,
workspaceId,
twentyStandardApplicationId,
}: {
now: string;
workspaceId: string;
twentyStandardApplicationId: string;
dependencyFlatEntityMaps: undefined;
}): FlatFrontComponentMaps => {
const flatFrontComponentMaps: FlatFrontComponentMaps =
createEmptyFlatEntityMaps();
for (const frontComponentName of STANDARD_FRONT_COMPONENT_NAMES) {
const flatFrontComponent = createStandardFrontComponentFlatMetadata({
frontComponentName,
frontComponentId: v4(),
workspaceId,
twentyStandardApplicationId,
now,
});
addFlatEntityToFlatEntityMapsThroughMutationOrThrow({
flatEntity: flatFrontComponent,
flatEntityMapsToMutate: flatFrontComponentMaps,
});
}
return flatFrontComponentMaps;
};
@@ -0,0 +1,37 @@
import { type FlatFrontComponent } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component.type';
import { STANDARD_FRONT_COMPONENTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-front-component.constant';
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
export const createStandardFrontComponentFlatMetadata = ({
frontComponentName,
frontComponentId,
workspaceId,
twentyStandardApplicationId,
now,
}: {
frontComponentName: keyof typeof STANDARD_FRONT_COMPONENTS;
frontComponentId: string;
workspaceId: string;
twentyStandardApplicationId: string;
now: string;
}): FlatFrontComponent => {
const definition = STANDARD_FRONT_COMPONENTS[frontComponentName];
return {
id: frontComponentId,
universalIdentifier: definition.universalIdentifier,
applicationId: twentyStandardApplicationId,
applicationUniversalIdentifier:
TWENTY_STANDARD_APPLICATION.universalIdentifier,
workspaceId,
name: definition.name,
description: null,
sourceComponentPath: definition.sourceComponentPath,
builtComponentPath: definition.builtComponentPath,
componentName: definition.componentName,
builtComponentChecksum: definition.builtComponentChecksum,
isHeadless: definition.isHeadless,
createdAt: now,
updatedAt: now,
};
};
@@ -9,6 +9,8 @@ import { buildStandardFlatFieldMetadataMaps } from 'src/engine/workspace-manager
import { getStandardObjectMetadataRelatedEntityIds } from 'src/engine/workspace-manager/twenty-standard-application/utils/get-standard-object-metadata-related-entity-ids.util';
import { getStandardPageLayoutMetadataRelatedEntityIds } from 'src/engine/workspace-manager/twenty-standard-application/utils/get-standard-page-layout-metadata-related-entity-ids.util';
import { buildStandardFlatIndexMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/index/build-standard-flat-index-metadata-maps.util';
import { buildStandardFlatCommandMenuItemMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/command-menu-item/build-standard-flat-command-menu-item-maps.util';
import { buildStandardFlatFrontComponentMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/front-component/build-standard-flat-front-component-maps.util';
import { buildStandardFlatNavigationMenuItemMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/navigation-menu-item/build-standard-flat-navigation-menu-item-maps.util';
import { buildStandardFlatObjectMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/build-standard-flat-object-metadata-maps.util';
import { buildStandardFlatPageLayoutTabMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/page-layout-tab/build-standard-flat-page-layout-tab-metadata-maps.util';
@@ -201,6 +203,23 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({
},
});
const flatFrontComponentMaps = buildStandardFlatFrontComponentMaps({
now,
workspaceId,
twentyStandardApplicationId,
dependencyFlatEntityMaps: undefined,
});
const flatCommandMenuItemMaps = buildStandardFlatCommandMenuItemMaps({
now,
workspaceId,
twentyStandardApplicationId,
dependencyFlatEntityMaps: {
flatFrontComponentMaps,
flatObjectMetadataMaps,
},
});
const allFlatEntityMaps: TwentyStandardAllFlatEntityMaps = {
flatViewFieldMaps,
flatViewFieldGroupMaps,
@@ -217,6 +236,8 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({
flatPageLayoutMaps,
flatPageLayoutTabMaps,
flatPageLayoutWidgetMaps,
flatFrontComponentMaps,
flatCommandMenuItemMaps,
};
const idByUniversalIdentifierByMetadataName: IdByUniversalIdentifierByMetadataName =