Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mnes 1071 implement workflow #27

Open
wants to merge 8 commits into
base: MNES-894-Establish-submodel-registry
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ jobs:

- name: E2E test collect artifact
id: test_artifact
if: always()
uses: actions/upload-artifact@master
with:
name: cypress-artifacts
Expand Down
64 changes: 43 additions & 21 deletions src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,45 @@ import { useIsMobile } from 'lib/hooks/UseBreakpoints';
import { messages } from 'lib/i18n/localization';
import { FormattedMessage } from 'react-intl';
import { SubmodelDetail } from './submodel/SubmodelDetail';
import { Key, Reference, Submodel } from '@aas-core-works/aas-core3.0-typescript/types';
import { Reference, Submodel } from '@aas-core-works/aas-core3.0-typescript/types';
import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect';
import { SubmodelSorting } from 'app/[locale]/viewer/_components/submodel/sorting/SubmodelSorting';
import { TabSelectorItem, VerticalTabSelector } from 'components/basics/VerticalTabSelector';
import { MobileModal } from 'components/basics/MobileModal';
import { useApis } from 'components/azureAuthentication/ApiProvider';
import { useRegistryAasState } from 'components/contexts/CurrentAasContext';
import { getSubmodelFromSubmodelDescriptor } from 'lib/searchUtilActions/search';
import { useEnv } from 'app/env/provider';


export type SubmodelsOverviewCardProps = { readonly smReferences?: Reference[]; readonly isLoading?: boolean };

export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) {
const [selectedItem, setSelectedItem] = useState<TabSelectorItem>();
const [selectedSubmodel, setSelectedSubmodel] = useState<Submodel>();
const { submodelClient } = useApis();
const [ registryAasData] = useRegistryAasState();
const [registryAasData] = useRegistryAasState();
const { submodelRegistryServiceClient } = useApis();

SubmodelSorting(selectedSubmodel);

const [items, setItems] = useState<TabSelectorItem[]>([]);
const [open, setOpen] = useState<boolean>(false);
const isMobile = useIsMobile();
const firstSubmodelIdShort = 'Nameplate';
const env = useEnv();

useAsyncEffect(async () => {
if (!props.smReferences) return;

const submodels: { id: string; label: string; metadata?: Submodel; endpoint?: string }[] = [];

async function fetchSubmodelFromRepo(reference: Reference) {
const id = reference.keys[0].value;
const metadata = await submodelClient.getSubmodelMetaDataById(id);
submodels.push({ id, label: metadata.idShort ?? '', metadata });
}

if (registryAasData) {
registryAasData.submodelDescriptors?.forEach((submodelDescriptor) => {
submodels.push({
Expand All @@ -43,14 +53,18 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) {
});
} else {
for (const reference of props.smReferences as Reference[]) {
for (const key of reference.keys as Key[]) {
try {
const metadata = await submodelClient.getSubmodelMetaDataById(key.value);
submodels.push({ id: key.value, label: metadata.idShort ?? '', metadata });
} catch (e) {
console.error(e);
}
try {
const submodelFromRegistry = env.SUBMODEL_REGISTRY_API_URL ? await submodelRegistryServiceClient.getSubmodelDescriptorsById(reference.keys[0].value) : null
submodels.push({
id: submodelFromRegistry.id,
label: submodelFromRegistry.idShort ?? '',
endpoint: submodelFromRegistry.endpoints[0].protocolInformation.href,
});
} catch (e) {
// Submodel registry is not available or submodel not found there -> search in repo
await fetchSubmodelFromRepo(reference);
}

}
}

Expand All @@ -60,6 +74,7 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) {
});
setItems(submodels);
}

}, [props.smReferences, registryAasData]);

useEffect(() => {
Expand All @@ -75,12 +90,19 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) {
let fetchedSubmodel;

if (selectedSubmodel) {
if (registryAasData && selectedSubmodel.endpoint) {
fetchedSubmodel = await getSubmodelFromSubmodelDescriptor(selectedSubmodel.endpoint);
if (selectedSubmodel.endpoint) {
try {
fetchedSubmodel = await getSubmodelFromSubmodelDescriptor(selectedSubmodel.endpoint);
} catch (e) {
// expexted behaviour if submodel registry is not available or submodel is not found there
}
}

if (!registryAasData) {
fetchedSubmodel = await submodelClient.getSubmodelById(selectedSubmodel?.id ?? '');
if (!registryAasData && !fetchedSubmodel) {
try {
fetchedSubmodel = await submodelClient.getSubmodelById(selectedSubmodel?.id ?? '');
} catch (e) {
console.error(e);
}
}
}

Expand All @@ -105,33 +127,33 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) {
<>
<Box>
{[0, 1, 2].map((i) => {
return <Skeleton variant="rectangular" key={i} height={50} sx={{ mb: 2 }} />;
return <Skeleton variant="rectangular" key={i} height={50} sx={{ mb: 2 }}/>;
})}
</Box>
<Box>
{[0, 1, 2].map((i) => {
return (
<Box sx={{ mb: 2 }} key={i}>
<Skeleton variant="text" width="50%" />
<Skeleton variant="text" width="30%" />
{i < 2 && <Divider sx={{ mt: 2 }} />}
<Skeleton variant="text" width="50%"/>
<Skeleton variant="text" width="30%"/>
{i < 2 && <Divider sx={{ mt: 2 }}/>}
</Box>
);
})}
</Box>
</>
) : (
<>
<VerticalTabSelector items={items} selected={selectedItem} setSelected={setSelectedItem} />
<VerticalTabSelector items={items} selected={selectedItem} setSelected={setSelectedItem}/>
{isMobile ? (
<MobileModal
title={items.find((i) => i.id === selectedItem?.id)?.label}
open={open}
handleClose={handleClose}
content={<SubmodelDetail submodel={selectedSubmodel} />}
content={<SubmodelDetail submodel={selectedSubmodel}/>}
/>
) : (
<SubmodelDetail submodel={selectedSubmodel} />
<SubmodelDetail submodel={selectedSubmodel}/>
)}
</>
)}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Dialog, DialogContent, Typography } from '@mui/material';
import { Reference, RelationshipElement } from '@aas-core-works/aas-core3.0-typescript/types';
import { Reference, RelationshipElement, Submodel } from '@aas-core-works/aas-core3.0-typescript/types';
import { DataRow } from 'components/basics/DataRow';
import { FormattedMessage } from 'react-intl';
import { messages } from 'lib/i18n/localization';
Expand All @@ -8,6 +8,7 @@ import { showError } from 'lib/util/ErrorHandlerUtil';
import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner';
import { useParams } from 'next/navigation';
import { useApis } from 'components/azureAuthentication/ApiProvider';
import { useEnv } from 'app/env/provider';

type RelationShipDetailsModalProps = {
readonly relationship: RelationshipElement;
Expand All @@ -24,17 +25,28 @@ export function RelationShipDetailsDialog(props: RelationShipDetailsModalProps)
const submodelId = relationship.second.keys[0]?.value;

const [subIdShort, setSubIdShort] = useState<string>();
const { repositoryClient, submodelClient } = useApis();
const { repositoryClient, submodelClient, submodelRegistryServiceClient } = useApis();
const env = useEnv();

useEffect(() => {
async function _fetchSubmodels() {
try {
const submodelRefs = (await repositoryClient.getSubmodelReferencesFromShell(
base64AasId as string,
)) as Reference[];
const submodels = await Promise.all(
submodelRefs.map((ref) => submodelClient.getSubmodelById(ref.keys[0].value)),
);
const submodels = [] as Submodel[];

for (const reference of submodelRefs) {
const id = reference.keys[0].value;
try {
const submodelFromRegistry = env.SUBMODEL_REGISTRY_API_URL ? await submodelRegistryServiceClient.getSubmodelDescriptorsById(reference.keys[0].value) : null
submodels.push(submodelFromRegistry);
} catch (e) {
// Submodel registry is not available or submodel not found there -> search in repo
submodels.push(await submodelClient.getSubmodelById(id));
}
}

const submodel = submodels.find((sm) => {
return sm.id === submodelId;
});
Expand Down
1 change: 1 addition & 0 deletions src/components/azureAuthentication/ApiProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,5 @@ export type Apis = {
submodelClient: SubmodelRepositoryApi;
discoveryServiceClient: DiscoveryServiceApi;
registryServiceClient: RegistryServiceApi;
submodelRegistryServiceClient: SubmodelRegistryServiceApi;
};