diff --git a/pkgs/ui/src/components/table/index.tsx b/pkgs/ui/src/components/table/index.tsx
new file mode 100644
index 0000000..cbfec7e
--- /dev/null
+++ b/pkgs/ui/src/components/table/index.tsx
@@ -0,0 +1,65 @@
+import React from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+
+import { NoDataOverlay } from "@/components/noDataOverlay";
+import { StyledTableCell, StyledTableRow } from "./style";
+import { ICustomTable, CustomTableConfiguration } from "@/types";
+
+const CustomTable = ({ configuration, data }: ICustomTable) => {
+ // display empty icon in case there is no data
+ if (!data || data.length === 0)
+ return ;
+
+ const renderTableCell = (
+ value: any,
+ cellKey: string,
+ render?: (param: any) => void | undefined,
+ ) => {
+ let renderedValue = value;
+
+ // cover use case if the data is an array
+ if (Array.isArray(value)) renderedValue = value.join(", ");
+
+ // cover use case if we want to render a component
+ if (render) renderedValue = render(value);
+
+ return (
+
+ {renderedValue}
+
+ );
+ };
+
+ return (
+
+
+
+
+ {configuration.map((header: CustomTableConfiguration) => (
+ {header.label}
+ ))}
+
+
+
+ {data.map((data: any, rowIndex: number) => (
+
+ {configuration.map((column: CustomTableConfiguration) => {
+ const cellValue: any = data[column.key];
+ const cellKey = column.key;
+ const renderComponent = column?.render;
+ return renderTableCell(cellValue, cellKey, renderComponent);
+ })}
+
+ ))}
+
+
+
+ );
+};
+
+export default CustomTable;
diff --git a/pkgs/ui/src/components/table/style.tsx b/pkgs/ui/src/components/table/style.tsx
new file mode 100644
index 0000000..b0e5429
--- /dev/null
+++ b/pkgs/ui/src/components/table/style.tsx
@@ -0,0 +1,23 @@
+import { styled } from "@mui/material/styles";
+import TableCell, { tableCellClasses } from "@mui/material/TableCell";
+import TableRow from "@mui/material/TableRow";
+
+export const StyledTableCell = styled(TableCell)(({ theme }) => ({
+ [`&.${tableCellClasses.head}`]: {
+ backgroundColor: theme.palette.common.black,
+ color: theme.palette.common.white,
+ },
+ [`&.${tableCellClasses.body}`]: {
+ fontSize: 14,
+ },
+}));
+
+export const StyledTableRow = styled(TableRow)(({ theme }) => ({
+ "&:nth-of-type(odd)": {
+ backgroundColor: theme.palette.action.hover,
+ },
+ // hide last border
+ "&:last-child td, &:last-child th": {
+ border: 0,
+ },
+}));
diff --git a/pkgs/ui/src/mock/access-point/index.ts b/pkgs/ui/src/mock/access-point/index.ts
new file mode 100644
index 0000000..9b139af
--- /dev/null
+++ b/pkgs/ui/src/mock/access-point/index.ts
@@ -0,0 +1,92 @@
+// AP - Attachements
+
+export const APAttachmentsDummyData = [
+ {
+ entity_name: "C1",
+ entity_DID: "did:sov:test:1234",
+ network: "Carlo's Home Network",
+ ip_address: "127.0.0.1",
+ },
+ {
+ entity_name: "C2",
+ entity_DID: "did:sov:test:4567",
+ network: "Steve's Home Network",
+ ip_address: "127.0.0.1",
+ },
+ {
+ entity_name: "C1-TEST",
+ entity_DID: "did:sov:test:0001",
+ network: "Test Network A",
+ ip_address: "127.0.0.1",
+ },
+ {
+ entity_name: "C2-TEST",
+ entity_DID: "did:sov:test:0002",
+ network: "Test Network B",
+ ip_address: "127.0.0.1",
+ },
+];
+export const APAttachmentsTableConfig = [
+ {
+ key: "entity_name",
+ label: "Entity name",
+ },
+ {
+ key: "entity_DID",
+ label: "Entity DID",
+ },
+ {
+ key: "network",
+ label: "Network",
+ },
+ {
+ key: "ip_address",
+ label: "IP address",
+ },
+];
+
+// AP - Service Repository
+export const APServiceRepositoryDummyData = [
+ {
+ service_name: "Carlo's Printing",
+ service_type: "3D Printing",
+ end_point: "URL",
+ producer: "C1",
+ producer_DID: "did:sov:test:1234",
+ network: "Carlo's Home Network",
+ },
+ {
+ service_name: "Jeff's Printing",
+ service_type: "3D Printing",
+ end_point: "URL",
+ producer: "C2",
+ producer_DID: "did:sov:test:5678",
+ network: "Jeff's Home Network",
+ },
+];
+export const APServiceRepositoryTableConfig = [
+ {
+ key: "service_name",
+ label: "Service name",
+ },
+ {
+ key: "service_type",
+ label: "Service type",
+ },
+ {
+ key: "end_point",
+ label: "End point",
+ },
+ {
+ key: "producer",
+ label: "Producer",
+ },
+ {
+ key: "producer_DID",
+ label: "Producer DID",
+ },
+ {
+ key: "network",
+ label: "Network",
+ },
+];
diff --git a/pkgs/ui/src/mock/dlg/index.ts b/pkgs/ui/src/mock/dlg/index.ts
new file mode 100644
index 0000000..33b9992
--- /dev/null
+++ b/pkgs/ui/src/mock/dlg/index.ts
@@ -0,0 +1,33 @@
+export const DLGResolutionDummyData = [
+ {
+ requester_name: "C1",
+ requester_DID: "did:sov:test:1234",
+ DID_resolved: "did:sov:test:1234",
+ timestamp: "2023.11.01 17:05:45",
+ },
+ {
+ requester_name: "C2",
+ requester_DID: "did:sov:test:5678",
+ DID_resolved: "did:sov:test:5678",
+ timestamp: "2023.12.01 15:05:50",
+ },
+];
+
+export const DLGResolutionTableConfig = [
+ {
+ key: "requester_name",
+ label: "Requester name",
+ },
+ {
+ key: "requester_DID",
+ label: "Requester DID",
+ },
+ {
+ key: "DID_resolved",
+ label: "DID resolved",
+ },
+ {
+ key: "timestamp",
+ label: "Timestamp",
+ },
+];
diff --git a/pkgs/ui/src/types/index.ts b/pkgs/ui/src/types/index.ts
new file mode 100644
index 0000000..d4635d5
--- /dev/null
+++ b/pkgs/ui/src/types/index.ts
@@ -0,0 +1,10 @@
+export interface CustomTableConfiguration {
+ key: string;
+ label: string;
+ render?: (param: any) => void;
+}
+
+export interface ICustomTable {
+ configuration: CustomTableConfiguration[];
+ data: any;
+}