import React from 'react'; import { compoundExpand } from '@patternfly/react-table'; import { ScreenIcon, RepositoryIcon, ContainerNodeIcon } from '@patternfly/react-icons'; import { translate as __ } from 'foremanReact/common/I18n'; import IconWithCount from '../components/IconWithCount'; import DetailsExpansion from '../expansions/DetailsExpansion'; import RepositoriesExpansion from '../expansions/RepositoriesExpansion'; import EnvironmentsExpansion from '../expansions/EnvironmentsExpansion'; import VersionsExpansion from '../expansions/VersionsExpansion'; import ContentViewName from '../components/ContentViewName'; import DetailsContainer from '../details/DetailsContainer'; export const buildColumns = () => [ __('Name'), __('Last published'), __('Details'), { title: __('Environments'), cellTransforms: [compoundExpand] }, { title: __('Repositories'), cellTransforms: [compoundExpand] }, { title: __('Versions'), cellTransforms: [compoundExpand] }, ]; const buildRow = (contentView, openColumn) => { const { id, composite, name, environments, repositories, versions, last_published: lastPublished, } = contentView; const row = [ { title: }, lastPublished || 'Not yet published', { title: __('Details'), props: { isOpen: false, ariaControls: `cv-details-expansion-${id}` } }, { title: , props: { isOpen: false, ariaControls: `cv-environments-expansion-${id}` }, }, { title: , props: { isOpen: false, ariaControls: `cv-repositories-expansion-${id}` }, }, { title: , props: { isOpen: false, ariaControls: `cv-versions-expansion-${id}` }, }, ]; if (openColumn) row[openColumn].props.isOpen = true; return row; }; const buildDetailDropdowns = (id, rowIndex, openColumn) => { const cvId = { cvId: id }; const expansionProps = { ...cvId, className: 'pf-m-no-padding' }; const containerProps = column => ({ ...cvId, isOpen: openColumn === column }); let detailDropdowns = [ { compoundParent: 2, cells: [ { title: ( ), props: { colSpan: 6 }, }, ], }, { compoundParent: 3, cells: [ { title: ( ), props: { colSpan: 6 }, }, ], }, { compoundParent: 4, cells: [ { title: ( ), props: { colSpan: 6 }, }, ], }, { compoundParent: 5, cells: [ { title: ( ), props: { colSpan: 6 }, }, ], }, ]; // The rows are indexed along with the hidden dropdown rows, so we need to offset the parent row const rowOffset = detailDropdowns.length + 1; detailDropdowns = detailDropdowns.map(detail => ({ ...detail, parent: rowIndex * rowOffset })); return detailDropdowns; }; const tableDataGenerator = (results, rowMapping) => { const updatedRowMapping = { ...rowMapping }; const contentViews = results || []; const columns = buildColumns(); const rows = []; contentViews.forEach((contentView, rowIndex) => { const { id } = contentView; // hasOwnProperty syntax because of https://eslint.org/docs/rules/no-prototype-builtins if (!Object.prototype.hasOwnProperty.call(updatedRowMapping, id)) { updatedRowMapping[id] = { expandedColumn: null, rowIndex: rows.length }; } const openColumn = updatedRowMapping[id].expandedColumn; const cells = buildRow(contentView, openColumn); const isOpen = !!openColumn; rows.push({ isOpen, cells }); rows.push(...buildDetailDropdowns(id, rowIndex, openColumn)); }); return { updatedRowMapping, rows, columns }; }; export default tableDataGenerator;