import type { CustomFieldOrigin } from '@wix/bex-core'; import { buildFieldActionsMenu, type FieldActionHandlers, type FieldActionHandlersConfig, type FieldActionKey, } from '../FieldActions'; import type { CustomFieldsPanelState, FieldActionsMenuBuilder, } from '../../state/CustomFields/CustomFieldsPanelState'; import type { SchemaState } from './SchemaState'; import { schemaFieldDisabledTooltips } from './schemaFieldDisable'; // Schema field-menu layout: edit + manage actions, then delete (divider before). const SCHEMA_MENU_GROUPS: FieldActionKey[][] = [ ['editField', 'makePrimary', 'duplicateField', 'duplicateFieldWithContent'], ['delete'], ]; export const schemaFieldActionHandlers = (s: SchemaState, panel: CustomFieldsPanelState) => ({ fieldId, origin, }: { fieldId: string; origin: CustomFieldOrigin; location: string; }): FieldActionHandlersConfig | null => { const { sourceState } = s; const field = sourceState.schema?.fields[fieldId]; if (!field) { return null; } const fa = sourceState.fieldActions; const canEdit = s.fieldsSource.fieldManagement?.canEditField(field) ?? false; const canDelete = sourceState.schema ? sourceState.source.canDeleteField(field, sourceState.schema) : false; const handlers: FieldActionHandlers = {}; if (canEdit) { handlers.editField = () => panel.openCustomFieldModal({ fieldId, origin }); } if (fa?.makePrimary) { handlers.makePrimary = () => sourceState.makePrimary(fieldId); } if (fa?.duplicateField) { handlers.duplicateField = () => sourceState.duplicateField(fieldId); } if (fa?.duplicateFieldWithContent) { handlers.duplicateFieldWithContent = () => sourceState.duplicateFieldWithContent(fieldId); } if (canDelete && fa?.deleteField) { handlers.delete = () => panel.deleteFieldModal.modal.open({ id: fieldId, origin, fieldName: field.displayName, }); } if (Object.keys(handlers).length === 0) { return null; } return { handlers, disabledTooltips: schemaFieldDisabledTooltips(field, { canEdit, canAddFields: s.fieldsSource.fieldManagement?.canAddFields ?? false, }), loading: { makePrimary: sourceState.makePrimaryTask.status.isLoading, duplicateField: sourceState.duplicateTask.status.isLoading, duplicateFieldWithContent: sourceState.duplicateWithContentTask.status.isLoading, }, }; }; export const createSchemaFieldActionsMenu = (s: SchemaState) => (panel: CustomFieldsPanelState): FieldActionsMenuBuilder => { const handlers = schemaFieldActionHandlers(s, panel); const t = s.sourceState.container.translate; return (args) => buildFieldActionsMenu({ fieldId: args.fieldId, config: handlers(args), groups: SCHEMA_MENU_GROUPS, translate: t, tooltipContent: t('cairo.custom-columns.more-actions.tooltip'), bi: { reportBi: s.sourceState.container.reportBi, location: args.location, listSize: s.sourceState.fields.length, }, }); };