diff --git a/webpack/components/Table/TableHooks.js b/webpack/components/Table/TableHooks.js deleted file mode 100644 index 414a4e7d585..00000000000 --- a/webpack/components/Table/TableHooks.js +++ /dev/null @@ -1,315 +0,0 @@ -import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; -import { isEmpty } from 'lodash'; -import { useLocation } from 'react-router-dom'; -import { translate as __ } from 'foremanReact/common/I18n'; -import { friendlySearchParam } from '../../utils/helpers'; - -class ReactConnectedSet extends Set { - constructor(initialValue, forceRender) { - super(); - this.forceRender = forceRender; - // The constructor would normally call add() with the initial value, but since we - // must call super() at the top, this.forceRender() isn't defined yet. - // So, we call super() above with no argument, then call add() manually below - // after forceRender is defined - if (initialValue) { - if (initialValue.constructor.name === 'Array') { - initialValue.forEach(id => super.add(id)); - } else { - super.add(initialValue); - } - } - } - - add(value) { - const result = super.add(value); // ensuring these methods have the same API as the superclass - this.forceRender(); - return result; - } - - clear() { - const result = super.clear(); - this.forceRender(); - return result; - } - - delete(value) { - const result = super.delete(value); - this.forceRender(); - return result; - } - - onToggle(isOpen, id) { - if (isOpen) { - this.add(id); - } else { - this.delete(id); - } - } - - addAll(ids) { - ids.forEach(id => super.add(id)); - this.forceRender(); - } -} - -export const useSet = (initialArry) => { - const [, setToggle] = useState(Date.now()); - // needed because mutating a Ref won't cause React to rerender - const forceRender = () => setToggle(Date.now()); - const set = useRef(new ReactConnectedSet(initialArry, forceRender)); - return set.current; -}; - -export const useSelectionSet = ({ - results, - metadata, - initialArry = [], - idColumn = 'id', - isSelectable = () => true, -}) => { - const selectionSet = useSet(initialArry); - const pageIds = results?.map(result => result[idColumn]) ?? []; - const selectableResults = useMemo(() => results?.filter(result => - isSelectable(result)) ?? [], [results, isSelectable]); - const selectedResults = useRef({}); // { id: result } - const canSelect = useCallback((id) => { - const selectableIds = new Set(selectableResults.map(result => result[idColumn])); - return selectableIds.has(id); - }, [idColumn, selectableResults]); - const areAllRowsOnPageSelected = () => - Number(pageIds?.length) > 0 && - pageIds.every(result => selectionSet.has(result) || !canSelect(result)); - - const areAllRowsSelected = () => - Number(selectionSet.size) > 0 && selectionSet.size === Number(metadata.selectable); - - const selectPage = () => { - const selectablePageIds = pageIds.filter(canSelect); - selectionSet.addAll(selectablePageIds); - // eslint-disable-next-line no-restricted-syntax - for (const result of selectableResults) { - selectedResults.current[result[idColumn]] = result; - } - }; - const clearSelectedResults = () => { - selectedResults.current = {}; - }; - const selectNone = () => { - selectionSet.clear(); - clearSelectedResults(); - }; - const selectOne = (isSelected, id, data) => { - if (canSelect(id)) { - if (isSelected) { - if (data) selectedResults.current[id] = data; - selectionSet.add(id); - } else { - delete selectedResults.current[id]; - selectionSet.delete(id); - } - } - }; - - const selectedCount = selectionSet.size; - - const isSelected = useCallback(id => - canSelect(id) && selectionSet.has(id), [canSelect, selectionSet]); - - return { - selectOne, - selectedCount, - areAllRowsOnPageSelected, - areAllRowsSelected, - selectPage, - selectNone, - isSelected, - isSelectable: canSelect, - selectionSet, - selectedResults: Object.values(selectedResults.current), - clearSelectedResults, - }; -}; - -const usePrevious = (value) => { - const ref = useRef(); - useEffect(() => { - ref.current = value; - }); - return ref.current; -}; - -export const useBulkSelect = ({ - results, - metadata, - initialArry = [], - initialSearchQuery = '', - idColumn = 'id', - filtersQuery = '', - isSelectable, -}) => { - const { selectionSet: inclusionSet, ...selectOptions } = - useSelectionSet({ - results, metadata, initialArry, idColumn, isSelectable, - }); - const exclusionSet = useSet([]); - const [searchQuery, updateSearchQuery] = useState(initialSearchQuery); - const [selectAllMode, setSelectAllMode] = useState(false); - const selectedCount = selectAllMode ? - Number(metadata.selectable) - exclusionSet.size : selectOptions.selectedCount; - - const areAllRowsOnPageSelected = () => selectAllMode || - selectOptions.areAllRowsOnPageSelected(); - - const areAllRowsSelected = () => (selectAllMode && exclusionSet.size === 0) || - selectOptions.areAllRowsSelected(); - - const isSelected = useCallback((id) => { - if (!selectOptions.isSelectable(id)) { - return false; - } - if (selectAllMode) { - return !exclusionSet.has(id); - } - return inclusionSet.has(id); - }, [exclusionSet, inclusionSet, selectAllMode, selectOptions]); - - const selectPage = () => { - setSelectAllMode(false); - selectOptions.selectPage(); - }; - - const selectNone = useCallback(() => { - setSelectAllMode(false); - exclusionSet.clear(); - inclusionSet.clear(); - selectOptions.clearSelectedResults(); - }, [exclusionSet, inclusionSet, selectOptions]); - - const selectOne = (isRowSelected, id, data) => { - if (selectAllMode) { - if (isRowSelected) { - exclusionSet.delete(id); - } else { - exclusionSet.add(id); - } - } else { - selectOptions.selectOne(isRowSelected, id, data); - } - }; - - const selectAll = (checked) => { - setSelectAllMode(checked); - if (checked) { - exclusionSet.clear(); - } else { - inclusionSet.clear(); - } - }; - - const fetchBulkParams = (idColumnName = idColumn) => { - const searchQueryWithExclusionSet = () => { - const query = [searchQuery, filtersQuery, - !isEmpty(exclusionSet) && `${idColumnName} !^ (${[...exclusionSet].join(',')})`]; - return query.filter(item => item).join(' and '); - }; - - const searchQueryWithInclusionSet = () => { - if (isEmpty(inclusionSet)) throw new Error('Cannot build a search query with no items selected'); - return `${idColumnName} ^ (${[...inclusionSet].join(',')})`; - }; - - return selectAllMode ? searchQueryWithExclusionSet() : searchQueryWithInclusionSet(); - }; - - const prevSearchRef = usePrevious({ searchQuery }); - - useEffect(() => { - // if search value changed and cleared from a string to empty value - // And it was select all -> then reset selections - if ((prevSearchRef && !isEmpty(prevSearchRef.searchQuery)) && - isEmpty(searchQuery) && selectAllMode) { - selectNone(); - } - }, [searchQuery, selectAllMode, prevSearchRef, selectNone]); - - return { - ...selectOptions, - selectPage, - selectNone, - selectAll, - selectAllMode, - isSelected, - selectedCount, - fetchBulkParams, - searchQuery, - updateSearchQuery, - selectOne, - areAllRowsOnPageSelected, - areAllRowsSelected, - }; -}; - -// takes a url query like ?type=security&search=name+~+foo -// and returns an object -// { -// type: 'security', -// searchParam: 'name ~ foo' -// } -export const useUrlParams = () => { - const location = useLocation(); - const { search: urlSearchParam, ...urlParams } - = Object.fromEntries(new URLSearchParams(location.search).entries()); - const searchParam = urlSearchParam ? friendlySearchParam(urlSearchParam) : ''; - return { - searchParam, - ...urlParams, - }; -}; - -export const useTableSort = ({ - allColumns, - columnsToSortParams, - initialSortColumnName, -}) => { - const translatedInitialSortColumnName = initialSortColumnName - ? __(initialSortColumnName) - : allColumns[0]; - if (!Object.keys(columnsToSortParams).includes(translatedInitialSortColumnName)) { - throw new Error(`translatedInitialSortColumnName '${translatedInitialSortColumnName}' must also be defined in columnsToSortParams`); - } - const [activeSortColumn, setActiveSortColumn] = useState(translatedInitialSortColumnName); - const [activeSortDirection, setActiveSortDirection] = useState('asc'); - - if (!allColumns.includes(activeSortColumn)) { - setActiveSortColumn(translatedInitialSortColumnName); - } - - // Patternfly sort function - const onSort = (_event, index, direction) => { - setActiveSortColumn(allColumns?.[index]); - setActiveSortDirection(direction); - }; - - // Patternfly sort params to pass to the component. - // (but you should probably just use instead) - const pfSortParams = (columnName, newSortColIndex) => ({ - columnIndex: newSortColIndex ?? allColumns?.indexOf(columnName), - sortBy: { - defaultDirection: 'asc', - direction: activeSortDirection, - index: allColumns?.indexOf(activeSortColumn), - }, - onSort, - }); - - return { - pfSortParams, - apiSortParams: { // scoped_search params to pass to the Katello API - sort_by: columnsToSortParams[activeSortColumn], - sort_order: activeSortDirection, - }, - activeSortColumn, // state values to pass as additionalListeners - activeSortDirection, - }; -}; diff --git a/webpack/components/Table/__test__/useBulkSelect.test.js b/webpack/components/Table/__test__/useBulkSelect.test.js deleted file mode 100644 index 9d6e2de03f7..00000000000 --- a/webpack/components/Table/__test__/useBulkSelect.test.js +++ /dev/null @@ -1,99 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import { useBulkSelect } from '../TableHooks'; - -const isSelectable = () => true; -const idColumn = 'errata_id'; -const metadata = { - error: null, selectable: 2, subtotal: 2, total: 2, -}; -const results = [ - { - errata_id: 'RHSA-2022:2031', - id: 311, - severity: 'Low', - type: 'security', - }, - { - errata_id: 'RHSA-2022:2110', - id: 17, - severity: 'Low', - type: 'security', - }, -]; - -it('returns a scoped search string based on inclusionSet', () => { - const { result } = renderHook(() => useBulkSelect({ - results, - metadata, - idColumn, - isSelectable, - })); - - act(() => { - result.current.selectOne(true, 'RHSA-2022:2031'); - }); - - expect(result.current.fetchBulkParams()).toBe('errata_id ^ (RHSA-2022:2031)'); -}); - -it('returns a scoped search string based on exclusionSet', () => { - const { result } = renderHook(() => useBulkSelect({ - results, - metadata, - idColumn, - isSelectable, - })); - - act(() => { - result.current.selectAll(true); - }); - - act(() => { - result.current.selectOne(false, 'RHSA-2022:2031'); - }); - - expect(result.current.fetchBulkParams()).toBe('errata_id !^ (RHSA-2022:2031)'); -}); - -it('adds search query to scoped search string based on exclusionSet', () => { - const { result } = renderHook(() => useBulkSelect({ - results, - metadata, - idColumn, - isSelectable, - })); - - act(() => { - result.current.updateSearchQuery('type=security'); - }); - - act(() => { - result.current.selectAll(true); - }); - - act(() => { - result.current.selectOne(false, 'RHSA-2022:2031'); - }); - - expect(result.current.fetchBulkParams()).toBe('type=security and errata_id !^ (RHSA-2022:2031)'); -}); - -it('adds filter dropdown query to scoped search string', () => { - const { result } = renderHook(() => useBulkSelect({ - results, - metadata, - idColumn, - isSelectable, - filtersQuery: 'severity=Low', - })); - - act(() => { - result.current.selectAll(true); - }); - - act(() => { - result.current.selectOne(false, 'RHSA-2022:2031'); - }); - - expect(result.current.fetchBulkParams()).toBe('severity=Low and errata_id !^ (RHSA-2022:2031)'); -}); diff --git a/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js b/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js index a40eb7e60ad..abeaf7efe7b 100644 --- a/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +++ b/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js @@ -18,7 +18,7 @@ import { PlusCircleIcon } from '@patternfly/react-icons'; import { translate as __ } from 'foremanReact/common/I18n'; import { propsToCamelCase } from 'foremanReact/common/helpers'; import PropTypes from 'prop-types'; -import { useSet } from '../../../../Table/TableHooks'; +import { useSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import { HostCollectionsAddModal, HostCollectionsRemoveModal } from './HostCollectionsModal'; import { hasRequiredPermissions, hostIsRegistered, userPermissionsFromHostDetails } from '../../hostDetailsHelpers'; import EmptyStateMessage from '../../../../Table/EmptyStateMessage'; diff --git a/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js b/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js index 4bccceb7dbb..dde2c7e3c62 100644 --- a/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +++ b/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js @@ -7,9 +7,9 @@ import { HOST_DETAILS_KEY } from 'foremanReact/components/HostDetails/consts'; import { translate as __ } from 'foremanReact/common/I18n'; import { urlBuilder } from 'foremanReact/common/urlHelpers'; import { propsToCamelCase } from 'foremanReact/common/helpers'; +import { useSelectionSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import PropTypes from 'prop-types'; import TableWrapper from '../../../../Table/TableWrapper'; -import { useSelectionSet } from '../../../../Table/TableHooks'; import { selectAvailableHostCollections, selectAvailableHostCollectionsStatus, selectRemovableHostCollections, selectRemovableHostCollectionsStatus } from './HostCollectionsSelectors'; import hostIdNotReady from '../../HostDetailsActions'; import { alterHostCollections, getHostAvailableHostCollections, getHostRemovableHostCollections } from './HostCollectionsActions'; diff --git a/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js b/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js index a8cc1c5744a..8f9cde68b4f 100644 --- a/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +++ b/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js @@ -24,8 +24,9 @@ import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors'; import IsoDate from 'foremanReact/components/common/dates/IsoDate'; import { urlBuilder } from 'foremanReact/common/urlHelpers'; import { propsToCamelCase } from 'foremanReact/common/helpers'; +import { useSet, useBulkSelect, useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; import SelectableDropdown from '../../../../SelectableDropdown'; -import { useSet, useBulkSelect, useUrlParams, useTableSort } from '../../../../../components/Table/TableHooks'; import TableWrapper from '../../../../../components/Table/TableWrapper'; import { ErrataType, ErrataSeverity, ErrataToggleGroupItem } from '../../../../../components/Errata'; import { getInstallableErrata } from './HostErrataActions'; diff --git a/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js b/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js index f9bc474b309..d3ff74425f2 100644 --- a/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +++ b/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js @@ -24,8 +24,9 @@ import { LongArrowAltUpIcon, CheckIcon, } from '@patternfly/react-icons'; +import { useBulkSelect, useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; import { selectModuleStreamStatus, selectModuleStream } from './ModuleStreamsSelectors'; -import { useBulkSelect, useTableSort, useUrlParams } from '../../../../Table/TableHooks'; import { getHostModuleStreams } from './ModuleStreamsActions'; import InactiveText from '../../../../../scenes/ContentViews/components/InactiveText'; import TableWrapper from '../../../../../components/Table/TableWrapper'; diff --git a/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js b/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js index a73f2e2786d..d251ebe81ad 100644 --- a/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +++ b/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js @@ -8,9 +8,9 @@ import { noop } from 'foremanReact/common/helpers'; import { translate as __ } from 'foremanReact/common/I18n'; import { urlBuilder } from 'foremanReact/common/urlHelpers'; import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors'; +import { useBulkSelect } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import PropTypes from 'prop-types'; import TableWrapper from '../../../../Table/TableWrapper'; -import { useBulkSelect } from '../../../../Table/TableHooks'; import { HOST_YUM_INSTALLABLE_PACKAGES_KEY } from './YumInstallablePackagesConstants'; import { selectHostYumInstallablePackagesStatus } from './YumInstallablePackagesSelectors'; import { getHostYumInstallablePackages } from './YumInstallablePackagesActions'; diff --git a/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js b/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js index 5d88f64c9d5..ed40f862e91 100644 --- a/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +++ b/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js @@ -21,11 +21,12 @@ import PropTypes from 'prop-types'; import { translate as __ } from 'foremanReact/common/I18n'; import { HOST_DETAILS_KEY } from 'foremanReact/components/HostDetails/consts'; import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors'; - +import { useSet, useBulkSelect, useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; import { urlBuilder } from 'foremanReact/common/urlHelpers'; import SelectableDropdown from '../../../../SelectableDropdown'; import TableWrapper from '../../../../../components/Table/TableWrapper'; -import { useBulkSelect, useTableSort, useUrlParams, useSet } from '../../../../../components/Table/TableHooks'; + import PackagesStatus from '../../../../../components/Packages'; import { getInstalledPackagesWithLatest, diff --git a/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js b/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js index 0eecfb9b7ed..76d4ec9f104 100644 --- a/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +++ b/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js @@ -42,12 +42,12 @@ import { Thead, Tr, } from '@patternfly/react-table'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; import { useBulkSelect, - useTableSort, useUrlParams, -} from '../../../../../components/Table/TableHooks'; +} from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import TableWrapper from '../../../../../components/Table/TableWrapper'; import hostIdNotReady from '../../HostDetailsActions'; import { selectHostDetailsStatus } from '../../HostDetailsSelectors.js'; diff --git a/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js b/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js index 4e62ed48a51..e7bcde5cc76 100644 --- a/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +++ b/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js @@ -8,9 +8,10 @@ import { translate as __ } from 'foremanReact/common/I18n'; import { TableVariant, Thead, Tbody, Tr, Th, Td } from '@patternfly/react-table'; import { useSelector } from 'react-redux'; import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors'; +import { useBulkSelect, useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; import TracesEnabler from './TracesEnabler'; import TableWrapper from '../../../../Table/TableWrapper'; -import { useBulkSelect, useTableSort, useUrlParams } from '../../../../Table/TableHooks'; import { getHostTraces } from './HostTracesActions'; import { resolveTraces } from '../RemoteExecutionActions'; import { selectHostTracesStatus } from './HostTracesSelectors'; diff --git a/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js b/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js index 423c9621568..a5e2db82b3a 100644 --- a/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +++ b/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js @@ -1,12 +1,12 @@ import React from 'react'; import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper'; +import * as hooks from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import { nockInstance, assertNockRequest, mockForemanAutocomplete } from '../../../../../test-utils/nockWrapper'; import { foremanApi } from '../../../../../services/api'; import { HOST_PACKAGES_KEY, PACKAGES_SEARCH_QUERY, SELECTED_UPDATE_VERSIONS } from '../PackagesTab/HostPackagesConstants'; import { PackagesTab } from '../PackagesTab/PackagesTab.js'; import mockPackagesData from './packages.fixtures.json'; import { REX_FEATURES } from '../RemoteExecutionConstants'; -import * as hooks from '../../../../Table/TableHooks'; jest.mock('../../hostDetailsHelpers', () => ({ ...jest.requireActual('../../hostDetailsHelpers'), diff --git a/webpack/components/extensions/Hosts/ActionsBar/index.js b/webpack/components/extensions/Hosts/ActionsBar/index.js index 1a28d17eb7b..187a55228b3 100644 --- a/webpack/components/extensions/Hosts/ActionsBar/index.js +++ b/webpack/components/extensions/Hosts/ActionsBar/index.js @@ -17,7 +17,7 @@ const HostActionsBar = () => { const query = fetchBulkParams({ selectAllQuery: 'created_at < "1 second ago"' }); href = foremanUrl(`/change_host_content_source?search=${query}`); } else if (selectedCount > 0) { - href = foremanUrl(`/change_host_content_source?search=${fetchBulkParams({})}`); + href = foremanUrl(`/change_host_content_source?search=${fetchBulkParams()}`); } const title = __('Change content source'); diff --git a/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js b/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js index 7c53ef2b8aa..785965f9c4e 100644 --- a/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +++ b/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js @@ -27,13 +27,15 @@ import { TextVariants, } from '@patternfly/react-core'; import { TableVariant, Tbody, Td, Th, Thead, Tr, ActionsColumn } from '@patternfly/react-table'; +import { useSelectionSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; + import TableWrapper from '../../../components/Table/TableWrapper'; import { selectAlternateContentSources, selectAlternateContentSourcesError, selectAlternateContentSourcesStatus, } from '../ACSSelectors'; -import { useSelectionSet, useTableSort } from '../../../components/Table/TableHooks'; import getAlternateContentSources, { deleteACS, bulkDeleteACS, getACSDetails, refreshACS, bulkRefreshACS } from '../ACSActions'; import ACSCreateWizard from '../Create/ACSCreateWizard'; import LastSync from '../../ContentViews/Details/Repositories/LastSync'; diff --git a/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js b/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js index 8c4353f4c99..957ee3eef77 100644 --- a/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +++ b/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js @@ -39,6 +39,7 @@ import { Th, Td, } from '@patternfly/react-table'; +import { useSelectionSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import { useKatelloDocUrl } from '../../../../utils/useKatelloDocUrl'; import AddedStatusLabel from '../../../../components/AddedStatusLabel'; import SelectableDropdown from '../../../../components/SelectableDropdown'; @@ -64,7 +65,6 @@ import { import ContentCounts from './ContentCounts'; import LastSync from './LastSync'; import RepoIcon from './RepoIcon'; -import { useSelectionSet } from '../../../../components/Table/TableHooks'; const allRepositories = 'All repositories'; diff --git a/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js b/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js index e3c5daf4fb7..f97af6b9b40 100644 --- a/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +++ b/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js @@ -4,10 +4,10 @@ import { } from 'react-redux'; import PropTypes from 'prop-types'; import { translate as __ } from 'foremanReact/common/I18n'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; import { TableVariant, Tr, Th, Tbody, Td, Thead } from '@patternfly/react-table'; import { TableType } from './CVVersionCompareConfig'; import TableWrapper from '../../../../../components/Table/TableWrapper'; -import { useTableSort } from '../../../../../components/Table/TableHooks'; import './CVVersionCompare.scss'; const CVVersionCompareTable = ({ diff --git a/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js b/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js index 4ca8ff5cc13..0055121fb6e 100644 --- a/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +++ b/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js @@ -8,7 +8,7 @@ import { STATUS } from 'foremanReact/constants'; import { Link } from 'react-router-dom'; import PropTypes from 'prop-types'; import { first } from 'lodash'; -import { useSelectionSet } from '../../../../components/Table/TableHooks'; +import { useSelectionSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import TableWrapper from '../../../../components/Table/TableWrapper'; import InactiveText from '../../components/InactiveText'; import ContentViewVersionEnvironments from './ContentViewVersionEnvironments'; diff --git a/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js b/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js index 58c934c0615..4ece9a5855a 100644 --- a/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +++ b/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js @@ -3,6 +3,7 @@ import { useDispatch } from 'react-redux'; import PropTypes from 'prop-types'; import { Wizard } from '@patternfly/react-core'; import { translate as __ } from 'foremanReact/common/I18n'; +import { useSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import getEnvironmentPaths from '../../../components/EnvironmentPaths/EnvironmentPathActions'; import CVEnvironmentSelectionForm from './RemoveSteps/CVEnvironmentSelectionForm'; import CVReassignActivationKeysForm from './RemoveSteps/CVReassignActivationKeysForm'; @@ -12,7 +13,6 @@ import CVVersionDeleteFinish from './RemoveSteps/CVVersionDeleteFinish'; import getContentViewDetails from '../../ContentViewDetailActions'; import getContentViews from '../../../ContentViewsActions'; import DeleteContext from './DeleteContext'; -import { useSet } from '../../../../../components/Table/TableHooks'; const RemoveCVVersionWizard = ({ cvId, versionIdToRemove, versionNameToRemove, diff --git a/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js b/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js index 15c523b5361..9269fd68440 100644 --- a/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +++ b/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js @@ -21,7 +21,7 @@ import { Thead, Tr, } from '@patternfly/react-table'; -import { useUrlParams } from '../../../../../components/Table/TableHooks'; +import { useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import TableWrapper from '../../../../../components/Table/TableWrapper'; import { TableType } from './ContentViewVersionDetailConfig'; diff --git a/webpack/scenes/ContentViews/Table/ContentViewsTable.js b/webpack/scenes/ContentViews/Table/ContentViewsTable.js index 2bf8a115f1d..ceb6618daa2 100644 --- a/webpack/scenes/ContentViews/Table/ContentViewsTable.js +++ b/webpack/scenes/ContentViews/Table/ContentViewsTable.js @@ -4,6 +4,8 @@ import { Link } from 'react-router-dom'; import { omit } from 'lodash'; import { translate as __ } from 'foremanReact/common/I18n'; import LongDateTime from 'foremanReact/components/common/dates/LongDateTime'; +import { useSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; +import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort'; import { Button } from '@patternfly/react-core'; import { TableVariant, Thead, Tbody, Th, Tr, Td, ExpandableRowContent } from '@patternfly/react-table'; import TableWrapper from '../../../components/Table/TableWrapper'; @@ -15,7 +17,6 @@ import { selectContentViews, selectContentViewStatus, selectContentViewError } f import ContentViewVersionPromote from '../Details/Promote/ContentViewVersionPromote'; import getEnvironmentPaths from '../components/EnvironmentPaths/EnvironmentPathActions'; import { hasPermission } from '../helpers'; -import { useSet, useTableSort } from '../../../components/Table/TableHooks'; import ContentViewIcon from '../components/ContentViewIcon'; import { urlBuilder } from '../../../__mocks__/foremanReact/common/urlHelpers'; import LastSync from '../Details/Repositories/LastSync'; diff --git a/webpack/scenes/Hosts/ChangeContentSource/index.js b/webpack/scenes/Hosts/ChangeContentSource/index.js index dfbf2d5346a..ab735a4917e 100644 --- a/webpack/scenes/Hosts/ChangeContentSource/index.js +++ b/webpack/scenes/Hosts/ChangeContentSource/index.js @@ -9,6 +9,7 @@ import { STATUS } from 'foremanReact/constants'; import BreadcrumbBar from 'foremanReact/components/BreadcrumbBar'; import Head from 'foremanReact/components/Head'; import { useForemanHostsPageUrl } from 'foremanReact/Root/Context/ForemanContext'; +import { useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import { selectApiDataStatus, selectApiContentViewStatus, @@ -21,7 +22,6 @@ import { selectApiDataStatus, selectTemplate } from './selectors'; import { getHostIds, formIsLoading } from './helpers'; -import { useUrlParams } from '../../../components/Table/TableHooks'; import { getFormData, getProxy, diff --git a/webpack/scenes/SmartProxy/ExpandableCvDetails.js b/webpack/scenes/SmartProxy/ExpandableCvDetails.js index fcfe8425310..524ddc5bdcc 100644 --- a/webpack/scenes/SmartProxy/ExpandableCvDetails.js +++ b/webpack/scenes/SmartProxy/ExpandableCvDetails.js @@ -5,8 +5,8 @@ import { TableComposable, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-tab import { CheckCircleIcon, TimesCircleIcon } from '@patternfly/react-icons'; import LongDateTime from 'foremanReact/components/common/dates/LongDateTime'; import { urlBuilder } from 'foremanReact/common/urlHelpers'; +import { useSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import ContentViewIcon from '../ContentViews/components/ContentViewIcon'; -import { useSet } from '../../components/Table/TableHooks'; import ExpandedSmartProxyRepositories from './ExpandedSmartProxyRepositories'; const ExpandableCvDetails = ({ contentViews, contentCounts, envId }) => { diff --git a/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js b/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js index 155a01dbbbc..a7e84fcb71c 100644 --- a/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js +++ b/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js @@ -3,13 +3,13 @@ import { useSelector, useDispatch } from 'react-redux'; import PropTypes from 'prop-types'; import { translate as __ } from 'foremanReact/common/I18n'; import { Thead, Tbody, Th, Tr, Td } from '@patternfly/react-table'; +import { useSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks'; import getSmartProxyContent, { updateSmartProxyContentCounts } from './SmartProxyContentActions'; import { selectSmartProxyContent, selectSmartProxyContentStatus, selectSmartProxyContentError, } from './SmartProxyContentSelectors'; -import { useSet } from '../../components/Table/TableHooks'; import TableWrapper from '../../components/Table/TableWrapper'; import ExpandableCvDetails from './ExpandableCvDetails'; import ComponentEnvironments from '../ContentViews/Details/ComponentContentViews/ComponentEnvironments';