add ws support to inventory sources list

This commit is contained in:
Keith Grant 2020-07-14 11:43:59 -07:00
parent 80a6d4a29d
commit 4fca57dfd2
2 changed files with 55 additions and 3 deletions

View File

@ -19,6 +19,7 @@ import DatalistToolbar from '../../../components/DataListToolbar';
import AlertModal from '../../../components/AlertModal/AlertModal'; import AlertModal from '../../../components/AlertModal/AlertModal';
import ErrorDetail from '../../../components/ErrorDetail/ErrorDetail'; import ErrorDetail from '../../../components/ErrorDetail/ErrorDetail';
import InventorySourceListItem from './InventorySourceListItem'; import InventorySourceListItem from './InventorySourceListItem';
import useWsInventorySources from './useWsInventorySources';
const QS_CONFIG = getQSConfig('inventory', { const QS_CONFIG = getQSConfig('inventory', {
not__source: '', not__source: '',
@ -34,7 +35,7 @@ function InventorySourceList({ i18n }) {
const { const {
isLoading, isLoading,
error: fetchError, error: fetchError,
result: { sources, sourceCount, sourceChoices, sourceChoicesOptions }, result: { result, sourceCount, sourceChoices, sourceChoicesOptions },
request: fetchSources, request: fetchSources,
} = useRequest( } = useRequest(
useCallback(async () => { useCallback(async () => {
@ -44,18 +45,21 @@ function InventorySourceList({ i18n }) {
InventorySourcesAPI.readOptions(), InventorySourcesAPI.readOptions(),
]); ]);
return { return {
sources: results[0].data.results, result: results[0].data.results,
sourceCount: results[0].data.count, sourceCount: results[0].data.count,
sourceChoices: results[1].data.actions.GET.source.choices, sourceChoices: results[1].data.actions.GET.source.choices,
sourceChoicesOptions: results[1].data.actions, sourceChoicesOptions: results[1].data.actions,
}; };
}, [id, search]), }, [id, search]),
{ {
sources: [], result: [],
sourceCount: 0, sourceCount: 0,
sourceChoices: [], sourceChoices: [],
} }
); );
const sources = useWsInventorySources(result);
const canSyncSources = const canSyncSources =
sources.length > 0 && sources.length > 0 &&
sources.every(source => source.summary_fields.user_capabilities.start); sources.every(source => source.summary_fields.user_capabilities.start);

View File

@ -0,0 +1,48 @@
import { useState, useEffect } from 'react';
import useWebsocket from '../../../util/useWebsocket';
export default function useWsJobs(initialSources) {
const [sources, setSources] = useState(initialSources);
const lastMessage = useWebsocket({
jobs: ['status_changed'],
control: ['limit_reached_1'],
});
useEffect(() => {
setSources(initialSources);
}, [initialSources]);
useEffect(
function parseWsMessage() {
if (!lastMessage?.unified_job_id || !lastMessage?.inventory_source_id) {
return;
}
const sourceId = lastMessage.inventory_source_id;
const index = sources.findIndex(s => s.id === sourceId);
if (index > -1) {
setSources(updateSource(sources, index, lastMessage));
}
},
[lastMessage] // eslint-disable-line react-hooks/exhaustive-deps
);
return sources;
}
function updateSource(sources, index, message) {
const source = {
...sources[index],
status: message.status,
last_updated: message.finished,
summary_fields: {
...sources[index].summary_fields,
last_job: {
id: message.unified_job_id,
status: message.status,
finished: message.finished,
},
},
};
return [...sources.slice(0, index), source, ...sources.slice(index + 1)];
}