Basic recusrive nesting

This commit is contained in:
shamoon 2024-11-27 14:28:24 -08:00
parent b5144c04dc
commit 677af8b5be
4 changed files with 42 additions and 5 deletions

View File

@ -9,6 +9,7 @@ import ResolvedIcon from "components/resolvedicon";
export default function ServicesGroup({ export default function ServicesGroup({
group, group,
services, services,
groups,
layout, layout,
fiveColumns, fiveColumns,
disableCollapse, disableCollapse,
@ -74,7 +75,24 @@ export default function ServicesGroup({
}} }}
> >
<Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static> <Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<List group={group} services={services.services} layout={layout} useEqualHeights={useEqualHeights} /> {groups?.length ? (
<div className="grid grid-cols-1 gap-2">
{groups.map((subgroup) => (
<ServicesGroup
key={subgroup.name}
group={subgroup.name}
services={subgroup}
layout={layout}
fiveColumns={fiveColumns}
disableCollapse={disableCollapse}
useEqualHeights={useEqualHeights}
groupsInitiallyCollapsed={groupsInitiallyCollapsed}
/>
))}
</div>
) : (
<List group={group} services={services.services} layout={layout} useEqualHeights={useEqualHeights} />
)}
</Disclosure.Panel> </Disclosure.Panel>
</Transition> </Transition>
</> </>

View File

@ -293,6 +293,7 @@ function Home({ initialSettings }) {
key={group.name} key={group.name}
group={group.name} group={group.name}
services={group} services={group}
groups={group.groups}
layout={settings.layout?.[group.name]} layout={settings.layout?.[group.name]}
fiveColumns={settings.fiveColumns} fiveColumns={settings.fiveColumns}
disableCollapse={settings.disableCollapse} disableCollapse={settings.disableCollapse}
@ -318,6 +319,7 @@ function Home({ initialSettings }) {
key={group.name} key={group.name}
group={group.name} group={group.name}
services={group} services={group}
groups={group.groups}
layout={settings.layout?.[group.name]} layout={settings.layout?.[group.name]}
fiveColumns={settings.fiveColumns} fiveColumns={settings.fiveColumns}
disableCollapse={settings.disableCollapse} disableCollapse={settings.disableCollapse}

View File

@ -153,6 +153,7 @@ export async function servicesResponse() {
services: [...discoveredDockerGroup.services, ...discoveredKubernetesGroup.services, ...configuredGroup.services] services: [...discoveredDockerGroup.services, ...discoveredKubernetesGroup.services, ...configuredGroup.services]
.filter((service) => service) .filter((service) => service)
.sort(compareServices), .sort(compareServices),
groups: [...configuredGroup.groups], // TODO: do this properly
}; };
if (definedLayouts) { if (definedLayouts) {

View File

@ -26,7 +26,7 @@ function parseServicesToGroups(services) {
serviceGroup[name].forEach((entries) => { serviceGroup[name].forEach((entries) => {
const entryName = Object.keys(entries)[0]; const entryName = Object.keys(entries)[0];
if (Array.isArray(entries[entryName])) { if (Array.isArray(entries[entryName])) {
groups.push(parseServicesToGroups([{ [entryName]: entries[entryName] }])); groups = groups.concat(parseServicesToGroups([{ [entryName]: entries[entryName] }]));
} else { } else {
services.push({ services.push({
name: entryName, name: entryName,
@ -675,13 +675,29 @@ export function cleanServiceGroups(groups) {
}); });
return cleanedService; return cleanedService;
}), }),
type: serviceGroup.type,
groups: cleanServiceGroups(serviceGroup.groups),
})); }));
} }
function findGroupByName(groups, name) {
for (const group of groups) {
if (group.name === name) {
return group;
} else if (group.groups) {
const foundGroup = findGroupByName(group.groups, name);
if (foundGroup) {
return foundGroup;
}
}
}
return null;
}
export async function getServiceItem(group, service) { export async function getServiceItem(group, service) {
const configuredServices = await servicesFromConfig(); const configuredServices = await servicesFromConfig();
const serviceGroup = configuredServices.find((g) => g.name === group); const serviceGroup = findGroupByName(configuredServices, group);
if (serviceGroup) { if (serviceGroup) {
const serviceEntry = serviceGroup.services.find((s) => s.name === service); const serviceEntry = serviceGroup.services.find((s) => s.name === service);
if (serviceEntry) return serviceEntry; if (serviceEntry) return serviceEntry;
@ -689,14 +705,14 @@ export async function getServiceItem(group, service) {
const discoveredServices = await servicesFromDocker(); const discoveredServices = await servicesFromDocker();
const dockerServiceGroup = discoveredServices.find((g) => g.name === group); const dockerServiceGroup = findGroupByName(discoveredServices, group);
if (dockerServiceGroup) { if (dockerServiceGroup) {
const dockerServiceEntry = dockerServiceGroup.services.find((s) => s.name === service); const dockerServiceEntry = dockerServiceGroup.services.find((s) => s.name === service);
if (dockerServiceEntry) return dockerServiceEntry; if (dockerServiceEntry) return dockerServiceEntry;
} }
const kubernetesServices = await servicesFromKubernetes(); const kubernetesServices = await servicesFromKubernetes();
const kubernetesServiceGroup = kubernetesServices.find((g) => g.name === group); const kubernetesServiceGroup = findGroupByName(kubernetesServices, group);
if (kubernetesServiceGroup) { if (kubernetesServiceGroup) {
const kubernetesServiceEntry = kubernetesServiceGroup.services.find((s) => s.name === service); const kubernetesServiceEntry = kubernetesServiceGroup.services.find((s) => s.name === service);
if (kubernetesServiceEntry) return kubernetesServiceEntry; if (kubernetesServiceEntry) return kubernetesServiceEntry;