in uui/components/tables/columnsConfigurationModal/ColumnsConfigurationModal.tsx [51:177]
export function ColumnsConfigurationModal<TItem, TId, TFilter>(props: ColumnsConfigurationModalProps<TItem, TId, TFilter>) {
const i18n = uuiI18n.tables.columnsConfigurationModal;
const { columns, columnsConfig: initialColumnsConfig, defaultConfig, ...modalProps } = props;
const {
groupedColumns, searchValue, columnsConfig, reset, checkAll, uncheckAll, setSearchValue, hasAnySelectedColumns,
} = useColumnsConfiguration({
initialColumnsConfig,
columns,
defaultConfig,
getSearchFields: props.getSearchFields,
});
const apply = useCallback(() => modalProps.success(columnsConfig), [columnsConfig, modalProps]);
const close = useCallback(() => modalProps.abort(), [modalProps]);
const isNoData = useMemo(() => Object.values(groupedColumns).every((v) => !v.length), [groupedColumns]);
const renderVisible = () => {
const amountPinnedLeft = groupedColumns.displayedPinnedLeft.length;
const amountPinnedRight = groupedColumns.displayedPinnedRight.length;
const amountUnPinned = groupedColumns.displayedUnpinned.length;
const totalAmountOfVisibleColumns = amountPinnedLeft + amountUnPinned + amountPinnedRight;
if (!totalAmountOfVisibleColumns) {
return null;
}
const hasDividerBelowPinnedLeft = !!(amountPinnedLeft && amountUnPinned);
const hasDividerAbovePinnedRight = !!(amountPinnedRight && amountUnPinned);
const divider = (
<FlexRow
size={ null }
cx={ css.hDivider }
/>
);
return (
<>
{renderGroupTitle(i18n.displayedSectionTitle, totalAmountOfVisibleColumns)}
<SubGroup renderItem={ props.renderItem } title={ i18n.pinnedToTheLeftSubgroupTitle } items={ groupedColumns.displayedPinnedLeft } />
{hasDividerBelowPinnedLeft && divider}
<SubGroup renderItem={ props.renderItem } title={ i18n.notPinnedSubgroupTitle } items={ groupedColumns.displayedUnpinned } />
{hasDividerAbovePinnedRight && divider}
<SubGroup renderItem={ props.renderItem } title={ i18n.pinnedToTheRightSubgroupTitle } items={ groupedColumns.displayedPinnedRight } />
</>
);
};
const renderHidden = () => {
const items = groupedColumns.hidden;
const title = renderGroupTitle(i18n.hiddenSectionTitle, items.length);
if (!items.length) {
return null;
}
return (
<>
{ title }
<SubGroup renderItem={ props.renderItem } items={ items } />
</>
);
};
const applyButton = <Button caption={ i18n.applyButton } isDisabled={ !hasAnySelectedColumns } color="primary" onClick={ apply } />;
return (
<ModalBlocker { ...modalProps }>
<ModalWindow cx={ css.root } height="95dvh" maxHeight="95dvh" width={ settings.sizes.dataTable.columnsConfigurationModal.width }>
<ModalHeader title={ i18n.configureColumnsTitle } onClose={ close } />
<FlexRow
borderBottom={ true }
cx={ css.searchArea }
>
<SearchInput
size={ settings.sizes.dataTable.columnsConfigurationModal.search as SearchInputProps['size'] }
value={ searchValue }
onValueChange={ setSearchValue }
placeholder={ i18n.searchPlaceholder }
/>
<Dropdown
closeOnTargetClick={ true }
renderBody={ () => (
<DropdownMenuBody minWidth={ 100 }>
<DropdownMenuButton caption={ i18n.clearAllButton } onClick={ uncheckAll } />
<DropdownMenuButton caption={ i18n.selectAllButton } onClick={ checkAll } />
</DropdownMenuBody>
) }
renderTarget={ (props) => (
<Button
{ ...props }
fill="none"
icon={ MenuIcon }
size={ settings.sizes.dataTable.columnsConfigurationModal.search as ButtonProps['size'] }
color="secondary"
isDropdown={ false }
/>
) }
/>
</FlexRow>
<Panel background="surface-main" cx={ css.mainPanel }>
<ScrollBars>
{renderVisible()}
{renderHidden()}
{isNoData && (
<FlexRow cx={ css.noData }>
<Text cx={ css.noDataTitle }>
{i18n.noResultsFound.title}
</Text>
<Text cx={ css.noDataSubTitle }>
{i18n.noResultsFound.subTitle}
</Text>
</FlexRow>
)}
</ScrollBars>
</Panel>
<ModalFooter borderTop>
<LinkButton icon={ ResetIcon } caption={ i18n.resetToDefaultButton } onClick={ reset } />
<FlexSpacer />
<Button fill="none" color="secondary" caption={ i18n.cancelButton } onClick={ close } />
{!hasAnySelectedColumns ? (
<Tooltip content={ i18n.enableAtLeastOneColumnMessage } placement="top-end" color="critical">
{applyButton}
</Tooltip>
) : (
applyButton
)}
</ModalFooter>
</ModalWindow>
</ModalBlocker>
);
}