import { AddItem, Box, Divider, SidePanel } from '@wix/design-system'; import React, { lazy, Suspense, useEffect } from 'react'; import { CustomColumnsPanelStateBase } from '../../state/CustomColumnsPanelStateBase'; import { FiltersMap } from '@wix/bex-core'; import { useWixPatternsContainer } from '@wix/bex-core/react'; import { observer } from 'mobx-react-lite'; import { ColumnsList } from './ColumnsList'; import { CustomColumnsSearch } from './CustomColumnsSearch'; import { CustomColumnsNoResults } from './CustomColumnsNoResults'; import { useRafRender } from '../../hooks/useRafRender'; import { ScrollableContent } from '../ScrollableContent'; import { PatternsSidePanel } from '../SidePanel/PatternsSidePanel'; import { useSchemaContext } from '../../providers/SchemaContext'; import { FieldsSourceAddFieldCTA } from '../CustomFieldsPanel/FieldsSourceAddFieldCTA'; // ArchivedItems is an optional feature module — load it on demand so it stays // out of the core bundle. const ArchivedItemsCTAButton = lazy(() => import('../ArchivedItemsPanel/ArchivedItemsCTAButton').then((m) => ({ default: m.ArchivedItemsCTAButton, })), ); export interface CustomColumnsPanelProps { state: CustomColumnsPanelStateBase; } export function _CustomColumnsPanel({ state, }: CustomColumnsPanelProps) { const entered = useRafRender(); const { translate: t } = useWixPatternsContainer(); const { dragAndDrop, collectionFieldsSource } = state; const archive = collectionFieldsSource?.fieldsSource.archive; const deleteFieldModal = collectionFieldsSource?.customFieldsPanel.deleteFieldModal; const schemaCtx = useSchemaContext(); const isSchema = !!schemaCtx?.schema; const isEditable = !!collectionFieldsSource || isSchema; useEffect(() => state.init(), []); if (!entered) { return null; } const hasSearchResults = state.columnsCollection.result.items.length > 0; const hasSearchValue = state.searchValue.trim().length > 0; const totalColumns = state.orderedColumns.length; const hasFieldsSource = !!collectionFieldsSource; // Show search if there's a fields source OR if there are more than 5 columns const shouldShowSearch = hasFieldsSource || totalColumns > 5; const titleKey = isEditable ? 'cairo.table.manage-fields.title' : 'cairo.table.custom-columns.title'; const subtitleKey = isEditable ? dragAndDrop ? 'cairo.table.manage-fields.dragAndDrop.subtitle' : 'cairo.table.manage-fields.subtitle' : dragAndDrop ? 'cairo.table.custom-columns.dragAndDrop.subtitle' : 'cairo.table.custom-columns.subtitle'; return ( <> state.onClose()} > {shouldShowSearch && ( )} { if (state.dragAndDrop) { state.dragAndDrop.listRect.element = e; } }} > {hasSearchValue && !hasSearchResults ? ( ) : ( <> {archive?.shouldDisplay && deleteFieldModal && ( state.onClose()} dataHook="custom-columns" /> )} )} {collectionFieldsSource && ( )} {schemaCtx?.addField && ( {t('cairo.customFields.addCustomField.CTA')} )} ); } export const CustomColumnsPanel = observer(_CustomColumnsPanel);