import React from 'react'; import PropTypes from 'prop-types'; import { translate as __ } from 'foremanReact/common/I18n'; import { urlBuilder } from 'foremanReact/common/urlHelpers'; import { startCase } from 'lodash'; import { TimesIcon, CheckIcon, BugIcon, SecurityIcon, EnhancementIcon } from '@patternfly/react-icons'; import { Tooltip } from '@patternfly/react-core'; import LongDateTime from 'foremanReact/components/common/dates/LongDateTime'; import { selectPackageGroupsComparison, selectPackageGroupsComparisonStatus, selectRPMPackagesComparison, selectRPMPackagesComparisonStatus, selectFilesComparison, selectFilesComparisonStatus, selectErrataComparison, selectErrataComparisonStatus, selectModuleStreamsComparison, selectModuleStreamsComparisonStatus, selectDebPackagesComparison, selectDebPackagesComparisonStatus, selectDockerTagsComparison, selectDockerTagsComparisonStatus, selectGenericContentComparison, selectGenericContentComparisonStatus, selectRepositoriesComparison, selectRepositoriesComparisonStatus, } from '../../ContentViewDetailSelectors'; import { getPackageGroupsComparison, getRPMPackagesComparison, getFilesComparison, getErrataComparison, getModuleStreamsComparison, getDebPackagesComparison, getDockerTagsComparison, getGenericContentComparison, getRepositoriesComparison, } from '../../ContentViewDetailActions'; import ContentConfig from '../../../../Content/ContentConfig'; import RepoIcon from '../../Repositories/RepoIcon'; export const TableType = PropTypes.shape({ name: PropTypes.string, getCountKey: PropTypes.func, responseSelector: PropTypes.func, statusSelector: PropTypes.func, autocompleteEndpoint: PropTypes.string, autocompleteQueryParams: PropTypes.shape({}), bookmarkController: PropTypes.string, fetchItems: PropTypes.func, columnHeaders: PropTypes.arrayOf(PropTypes.shape({ title: PropTypes.string, width: PropTypes.number, getProperty: PropTypes.func, })), }); export default ({ versionOne, versionTwo, versionOneId, versionTwoId, viewBy, }) => { const compareContent = (item, versionId) => { const { comparison, } = item; if ( Number(comparison?.[0]) === Number(versionId) || Number(comparison?.[1]) === Number(versionId)) { return ( ); } return ( ); }; return ([ { name: __('Repositories'), route: 'repositories', getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.repositories?.length || itemVersionTwo?.repositories?.length, responseSelector: state => selectRepositoriesComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectRepositoriesComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/repositories', autocompleteQueryParams: { archived: true }, bookmarkController: 'katello_content_view_repositories', fetchItems: params => getRepositoriesComparison( versionOneId, versionTwoId, viewBy, params, ), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Type'), modifier: 'fitContent', getProperty: item => (), }, { title: __('Product'), getProperty: item => ( {item?.product?.name} ), }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'name', [__('Type')]: 'content_type', }, }, { name: __('RPM packages'), getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.rpm_count || itemVersionTwo?.rpm_count, responseSelector: state => selectRPMPackagesComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectRPMPackagesComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/packages', bookmarkController: 'katello_content_view_components', fetchItems: params => getRPMPackagesComparison( versionOneId, versionTwoId, viewBy, 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 }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'nvra', [__('Version')]: 'version', [__('Release')]: 'release', [__('Arch')]: 'arch', }, }, { name: __('RPM package groups'), getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.package_group_count || itemVersionTwo?.package_group_count, responseSelector: state => selectPackageGroupsComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectPackageGroupsComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/package_groups', bookmarkController: 'katello_content_view_components', fetchItems: params => getPackageGroupsComparison(versionOneId, versionTwoId, viewBy, params), columnHeaders: [ { title: __('Name'), getProperty: item => item?.name }, { title: __('Repository'), getProperty: item => item?.repository?.name }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'name', }, }, { name: __('Files'), getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.file_count || itemVersionTwo?.file_count, responseSelector: state => selectFilesComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectFilesComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/files', bookmarkController: 'katello_content_view_components', fetchItems: params => getFilesComparison(versionOneId, versionTwoId, viewBy, params), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Path'), getProperty: item => item?.path }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'name', }, }, { name: __('Errata'), getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.erratum_count || itemVersionTwo?.erratum_count, responseSelector: state => selectErrataComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectErrataComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/errata', bookmarkController: 'katello_content_view_components', fetchItems: params => getErrataComparison(versionOneId, versionTwoId, viewBy, 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 && , }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Errata ID')]: 'errata_id', [__('Title')]: 'title', [__('Type')]: 'type', }, }, { name: __('Module streams'), getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.module_stream_count || itemVersionTwo?.module_stream_count, responseSelector: state => selectModuleStreamsComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectModuleStreamsComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/module_streams', bookmarkController: 'katello_content_view_components', fetchItems: params => getModuleStreamsComparison(versionOneId, versionTwoId, viewBy, 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 }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'name', [__('Stream')]: 'stream', [__('Version')]: 'version', [__('Context')]: 'context', [__('Arch')]: 'arch', }, }, { name: __('Deb packages'), getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.deb_count || itemVersionTwo?.deb_count, responseSelector: state => selectDebPackagesComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectDebPackagesComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/debs', bookmarkController: 'katello_content_view_components', fetchItems: params => getDebPackagesComparison(versionOneId, versionTwoId, viewBy, params), columnHeaders: [ { title: __('Name'), getProperty: item => ( {item?.name} ), }, { title: __('Version'), getProperty: item => item?.version }, { title: __('Architecture'), getProperty: item => item?.architecture }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'name', [__('Version')]: 'version', [__('Architecture')]: 'architecture', }, }, { name: __('Container tags'), getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.docker_tag_count || itemVersionTwo?.docker_tag_count, responseSelector: state => selectDockerTagsComparison(state, versionOneId, versionTwoId, viewBy), statusSelector: state => selectDockerTagsComparisonStatus(state, versionOneId, versionTwoId, viewBy), autocompleteEndpoint: '/katello/api/v2/docker_tags', bookmarkController: 'katello_content_view_components', fetchItems: params => getDockerTagsComparison(versionOneId, versionTwoId, viewBy, 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'), getProperty: item => ( {item?.product?.name} ), }, { title: __('Image'), getProperty: item => item?.upstream_name }, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'name', }, }, ...ContentConfig.filter(config => !(config.names.pluralLabel === 'ostree_refs')).map(({ names: { pluralLowercase, pluralLabel, singularLabel }, columnHeaders, }) => ({ name: pluralLowercase, getCountKey: (itemVersionOne, itemVersionTwo) => itemVersionOne?.[`${singularLabel}_count`] || itemVersionTwo?.[`${singularLabel}_count`], responseSelector: state => selectGenericContentComparison(state, versionOneId, versionTwoId, pluralLabel, viewBy), statusSelector: state => selectGenericContentComparisonStatus( state, versionOneId, versionTwoId, pluralLabel, viewBy, ), autocompleteEndpoint: `/katello/api/v2/${pluralLabel}`, bookmarkController: 'katello_content_view_components', fetchItems: params => getGenericContentComparison(pluralLabel, versionOneId, versionTwoId, viewBy, params), columnHeaders: [ ...columnHeaders, { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) }, { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) }, ], sortConfig: { [__('Name')]: 'name', }, })), ]); };