import React from 'react'; import PropTypes from 'prop-types'; import { translate as __ } from 'foremanReact/common/I18n'; import { urlBuilder } from 'foremanReact/common/urlHelpers'; import LongDateTime from 'foremanReact/components/common/dates/LongDateTime'; import { startCase, camelCase } from 'lodash'; import { BugIcon, SecurityIcon, EnhancementIcon, } from '@patternfly/react-icons'; import { Tooltip } from '@patternfly/react-core'; import { getContentViewVersions, getDebPackages, getDockerTags, getErrata, getFiles, getModuleStreams, getPackageGroups, getRepositories, getRPMPackages, getContent, } from '../../ContentViewDetailActions'; import { selectCVVersions, selectCVVersionsStatus, selectDebPackages, selectDebPackagesStatus, selectDockerTags, selectDockerTagsStatus, selectFiles, selectFilesStatus, selectErrata, selectErrataStatus, selectModuleStreams, selectModuleStreamsStatus, selectRepositories, selectRepositoriesStatus, selectRPMPackageGroups, selectRPMPackageGroupsStatus, selectRPMPackages, selectRPMPackagesStatus, selectContent, selectContentStatus, } from '../../ContentViewDetailSelectors'; import ContentViewVersionRepositoryCell from './ContentViewVersionRepositoryCell'; import ContentConfig from '../../../../Content/ContentConfig'; export const TableType = PropTypes.shape({ name: PropTypes.string, route: PropTypes.string, getCountKey: PropTypes.func, repoType: PropTypes.string, responseSelector: PropTypes.func, statusSelector: PropTypes.func, autocompleteEndpoint: PropTypes.string, fetchItems: PropTypes.func, columnHeaders: PropTypes.arrayOf(PropTypes.shape({ title: PropTypes.string, width: PropTypes.number, getProperty: PropTypes.func, })), }); export default ({ cvId, versionId }) => [ { name: __('Components'), route: 'components', getCountKey: item => item?.component_view_count, responseSelector: state => selectCVVersions(state, cvId), statusSelector: state => selectCVVersionsStatus(state, cvId), autocompleteEndpoint: '', fetchItems: params => getContentViewVersions( cvId, { composite_version_id: versionId, ...params, content_view_id: undefined }, ), columnHeaders: [ { title: __('Content View Name'), getProperty: item => ( {item?.content_view?.name} ), }, { title: __('Version'), getProperty: item => item?.version }, { title: __('Updated'), getProperty: item => item?.updated_at && , }, ], disableSearch: true, }, { name: __('Repositories'), route: 'repositories', getCountKey: item => item?.repositories?.length, responseSelector: state => selectRepositories(state), statusSelector: state => selectRepositoriesStatus(state), autocompleteEndpoint: `/repositories/auto_complete_search?archived=true&content_view_version_id=${versionId}`, fetchItems: params => getRepositories({ content_view_version_id: versionId, archived: true, ...params, }), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Type'), getProperty: item => startCase(item?.content_type), }, { title: __('Product'), getProperty: item => ( {item?.product?.name} ), }, { title: __('Content'), getProperty: item => , }, ], }, { name: __('RPM Packages'), route: 'rpmPackages', repoType: 'yum', getCountKey: item => item?.rpm_count, responseSelector: state => selectRPMPackages(state), statusSelector: state => selectRPMPackagesStatus(state), autocompleteEndpoint: `/packages/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getRPMPackages({ content_view_version_id: versionId, ...params }), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.nvrea} ), }, { title: __('Version'), getProperty: item => item?.version }, { title: __('Release'), getProperty: item => item?.release }, { title: __('Arch'), getProperty: item => item?.arch }, { title: __('Epoch'), getProperty: item => item?.epoch }, ], }, { name: __('RPM Package Groups'), route: 'rpmPackageGroups', repoType: 'yum', getCountKey: item => item?.package_group_count, responseSelector: state => selectRPMPackageGroups(state), statusSelector: state => selectRPMPackageGroupsStatus(state), autocompleteEndpoint: `/package_groups/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getPackageGroups({ content_view_version_id: versionId, ...params }), columnHeaders: [ { title: __('Name'), getProperty: item => item?.name }, { title: __('Repository'), getProperty: item => item?.repository?.name }, ], }, { name: __('Files'), route: 'files', repoType: 'file', getCountKey: item => item?.file_count, responseSelector: state => selectFiles(state), statusSelector: state => selectFilesStatus(state), autocompleteEndpoint: `/files/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getFiles({ content_view_version_id: versionId, ...params }), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Path'), getProperty: item => item?.path }, ], }, { name: __('Errata'), route: 'errata', repoType: 'yum', getCountKey: item => item?.erratum_count, responseSelector: state => selectErrata(state), statusSelector: state => selectErrataStatus(state), autocompleteEndpoint: `/errata/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getErrata({ content_view_version_id: versionId, ...params }), columnHeaders: [ { title: __('Errata ID'), getProperty: item => ( {item?.errata_id} ), }, { title: __('Title'), getProperty: item => item?.name, }, { title: __('Type'), getProperty: (item) => { const errataIcons = { security: SecurityIcon, bugfix: BugIcon, enhancement: EnhancementIcon, enhancements: EnhancementIcon, }; const ErrataIcon = errataIcons[item?.type]; const itemType = startCase(item?.type); if (!ErrataIcon) return itemType; return <>{itemType}{item?.severity !== 'None' && ` - ${item.severity}`}; }, }, { title: __('Modular'), getProperty: (item) => { if (item?.module_streams?.length) return __('Yes'); return __('No'); }, }, { title: __('Applicable Content Hosts'), getProperty: item => item?.hosts_applicable_count, width: 25, }, { title: __('Updated'), getProperty: item => item?.updated && , }, ], }, { name: __('Module Streams'), route: 'moduleStreams', repoType: 'yum', getCountKey: item => item?.module_stream_count, responseSelector: state => selectModuleStreams(state), statusSelector: state => selectModuleStreamsStatus(state), autocompleteEndpoint: `/module_streams/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getModuleStreams({ content_view_version_id: versionId, ...params }), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Stream'), getProperty: item => item?.stream }, { title: __('Version'), getProperty: item => item?.version }, { title: __('Context'), getProperty: item => item?.context }, { title: __('Arch'), getProperty: item => item?.arch }, ], }, { name: __('Deb Packages'), route: 'debPackages', repoType: 'deb', getCountKey: item => item?.deb_count, responseSelector: state => selectDebPackages(state), statusSelector: state => selectDebPackagesStatus(state), autocompleteEndpoint: `/debs/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getDebPackages({ content_view_version_id: versionId, ...params }), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Version'), getProperty: item => item?.version }, { title: __('Architecture'), getProperty: item => item?.architecture }, ], }, { name: __('Container tags'), route: 'dockerTags', repoType: 'docker', getCountKey: item => item?.docker_tag_count, responseSelector: state => selectDockerTags(state), statusSelector: state => selectDockerTagsStatus(state), autocompleteEndpoint: `/docker_tags/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getDockerTags({ content_view_version_id: versionId, ...params }), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Available Schema Versions'), getProperty: (item) => { if (item?.manifest_schema1) return __('Schema Version 1'); return __('Schema Version 2'); }, }, { title: __('Product Name'), getProperty: item => item?.product?.name }, ], }, ...ContentConfig.map(({ names: { pluralTitle, pluralLabel, singularLabel }, columnHeaders, }) => ({ name: pluralTitle, route: camelCase(pluralLabel), repoType: singularLabel, getCountKey: item => item[`${singularLabel}_count`], responseSelector: state => selectContent(pluralLabel, state), statusSelector: state => selectContentStatus(pluralLabel, state), autocompleteEndpoint: `/${pluralLabel}/auto_complete_search?content_view_version_id=${versionId}`, fetchItems: params => getContent(pluralLabel, { content_view_version_id: versionId, ...params }), columnHeaders, })), ];