import React, { useCallback, useEffect } from 'react';
import { arrayOf, string, func, bool } from 'prop-types';
import { withRouter } from 'react-router-dom';
import { t, Trans } from '@lingui/macro';
import { FormGroup } from '@patternfly/react-core';
import { InstanceGroupsAPI } from 'api';
import { InstanceGroup } from 'types';
import { getQSConfig, parseQueryString } from 'util/qs';
import useRequest from 'hooks/useRequest';
import Popover from '../Popover';
import OptionsList from '../OptionsList';
import Lookup from './Lookup';
import LookupErrorMessage from './shared/LookupErrorMessage';
const QS_CONFIG = getQSConfig('instance-groups', {
page: 1,
page_size: 5,
order_by: 'name',
});
function InstanceGroupsLookup({
value,
onChange,
tooltip,
className,
required,
history,
fieldName,
validate,
}) {
const {
result: { instanceGroups, count, relatedSearchableKeys, searchableKeys },
request: fetchInstanceGroups,
error,
isLoading,
} = useRequest(
useCallback(async () => {
const params = parseQueryString(QS_CONFIG, history.location.search);
const [{ data }, actionsResponse] = await Promise.all([
InstanceGroupsAPI.read(params),
InstanceGroupsAPI.readOptions(),
]);
return {
instanceGroups: data.results,
count: data.count,
relatedSearchableKeys: (
actionsResponse?.data?.related_search_fields || []
).map((val) => val.slice(0, -8)),
searchableKeys: Object.keys(
actionsResponse.data.actions?.GET || {}
).filter((key) => actionsResponse.data.actions?.GET[key].filterable),
};
}, [history.location]),
{
instanceGroups: [],
count: 0,
relatedSearchableKeys: [],
searchableKeys: [],
}
);
useEffect(() => {
fetchInstanceGroups();
}, [fetchInstanceGroups]);
return (
}
fieldId="org-instance-groups"
>
Selected
Note: The order in which these are selected sets the execution
precedence. Select more than one to enable drag.
>
}
renderOptionsList={({ state, dispatch, canDelete }) => (
dispatch({ type: 'SELECT_ITEM', item })}
deselectItem={(item) => dispatch({ type: 'DESELECT_ITEM', item })}
sortSelectedItems={(selectedItems) =>
dispatch({ type: 'SET_SELECTED_ITEMS', selectedItems })
}
isSelectedDraggable
/>
)}
/>
);
}
InstanceGroupsLookup.propTypes = {
value: arrayOf(InstanceGroup).isRequired,
tooltip: string,
onChange: func.isRequired,
className: string,
required: bool,
validate: func,
fieldName: string,
};
InstanceGroupsLookup.defaultProps = {
tooltip: '',
className: '',
required: false,
validate: () => undefined,
fieldName: 'instance_groups',
};
export default withRouter(InstanceGroupsLookup);